前言
年末了,一直在忙項(xiàng)目舀寓,很少有時(shí)候?qū)懸恍┳约旱囊娊獾ㄊ=裉鞌D出一點(diǎn)時(shí)間來寫一下剛剛完成的微信的支付和跳轉(zhuǎn)到微信的功能。
如果你還沒有做過互墓,可以看一下必尼,作為參考。如果你做過這個(gè)了篡撵,也可以看一下判莉。總之一句話:有錢的捧個(gè)錢場(chǎng)育谬,沒錢的捧個(gè)人場(chǎng)券盅。????......
微信支付
我這是基于2015年12月在微信官網(wǎng)下載的demo寫的支付,如果和你做過的不相同膛檀,請(qǐng)查看咱們兩個(gè)的版本是否一樣锰镀。
首先,我個(gè)人感覺微信現(xiàn)在的iOS版的前端代碼比以前的簡(jiǎn)化了一些咖刃,現(xiàn)在的官網(wǎng)的demo最大的一點(diǎn)是不在前端放置任何數(shù)據(jù)了泳炉,都是一個(gè)接口請(qǐng)求下來(前一個(gè)版本還是在前端有一個(gè)微信設(shè)置例子,只是建議說后臺(tái)給數(shù)據(jù))嚎杨。
支付和官方demo里面的read.text說的一樣花鹅,需要兩步:調(diào)用請(qǐng)求支付,返回支付結(jié)果枫浙。
請(qǐng)求支付
+ (NSString *)jumpToBizPay {
//============================================================
// V3&V4支付流程實(shí)現(xiàn)
// 注意:參數(shù)配置請(qǐng)查看服務(wù)器端Demo
// 更新時(shí)間:2015年11月20日
//============================================================
NSString *urlString? = @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios";
//解析服務(wù)端返回json數(shù)據(jù)
NSError *error;
//加載一個(gè)NSURL對(duì)象
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
//將請(qǐng)求的url數(shù)據(jù)放到NSData對(duì)象中
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
if ( response != nil) {
NSMutableDictionary *dict = NULL;
//IOS5自帶解析類NSJSONSerialization從response中解析出數(shù)據(jù)放到字典中
dict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
NSLog(@"url:%@",urlString);
if(dict != nil){
NSMutableString *retcode = [dict objectForKey:@"retcode"];
if (retcode.intValue == 0){
NSMutableString *stamp? = [dict objectForKey:@"timestamp"];
//調(diào)起微信支付
PayReq* req? ? ? ? ? ? = [[PayReq alloc] init];
req.partnerId? ? ? ? ? = [dict objectForKey:@"partnerid"];
req.prepayId? ? ? ? ? ? = [dict objectForKey:@"prepayid"];
req.nonceStr? ? ? ? ? ? = [dict objectForKey:@"noncestr"];
req.timeStamp? ? ? ? ? = stamp.intValue;
req.package? ? ? ? ? ? = [dict objectForKey:@"package"];
req.sign? ? ? ? ? ? ? ? = [dict objectForKey:@"sign"];
[WXApi sendReq:req];
//日志輸出
NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",[dict objectForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign );
return @"";
}else{
return [dict objectForKey:@"retmsg"];
}
}else{
return @"服務(wù)器返回錯(cuò)誤刨肃,未獲取到j(luò)son對(duì)象";
}
}else{
return @"服務(wù)器返回錯(cuò)誤";
}
}
這一個(gè)方法放在WXApiRequestHandler這個(gè)類里面,這就是一個(gè)處理過程的類自脯。
支付結(jié)果返回
- (void)onResp:(BaseResp *)resp {
if([resp isKindOfClass:[PayResp class]]){
//支付返回結(jié)果之景,實(shí)際支付結(jié)果需要去微信服務(wù)器端查詢
NSString *strMsg,*strTitle = [NSString stringWithFormat:@"支付結(jié)果"];
switch (resp.errCode) {
case WXSuccess:
strMsg = @"我的支付結(jié)果:成功!";
NSLog(@"支付-PaySuccess膏潮,retcode = %d", resp.errCode);
break;
default:
strMsg = [NSString stringWithFormat:@"支付結(jié)果:失敹凸贰!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
NSLog(@"錯(cuò)誤,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
break;
}
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
}
}
這個(gè)方法放在WXApiManager類里面轻纪。
在我們需要調(diào)用微信支付的時(shí)候油额,調(diào)用方法:
- (void)bizPay {
NSString *res = [WXApiRequestHandler jumpToBizPay];
if( ![@"" isEqual:res] ){
UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"支付失敗" message:res delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alter show];
}
}
這就是微信支付的全部過程,當(dāng)然還有別忘了在appdelegate里面去調(diào)用支付結(jié)果的返回方法刻帚,這就是一個(gè)支付的全部過程潦嘶。支付寶支付也是這個(gè)過程,只是說他們各自的加密等小過程不一樣而已崇众。
有時(shí)候你會(huì)奇妙的發(fā)現(xiàn)你跳轉(zhuǎn)到微信支付的界面之后一個(gè)確定按鈕掂僵,然后其他的什么都沒有。我個(gè)人感覺可能有幾點(diǎn)原因:
1.你的app里面是不是集成了一些第三方分享之類的顷歌,里面包含了分享到微信锰蓬。如果有,在你appdelegate里面眯漩,把導(dǎo)入集成的代碼放在微信注冊(cè)代碼的前面執(zhí)行芹扭,確保程序后執(zhí)行微信支付。
2.看一下自己的scheme有沒有設(shè)置對(duì)赦抖,檢查一下自己的微信相關(guān)配置舱卡。
3.莫名不知道的錯(cuò)誤。刪除掉app再次運(yùn)行就好了队萤。????
應(yīng)用間跳轉(zhuǎn)到微信
我們需求是點(diǎn)擊按鈕跳轉(zhuǎn)微信公眾平臺(tái)轮锥,并復(fù)制一個(gè)字符串到剪切板。查了好久浮禾,怎么跳轉(zhuǎn)到微信交胚。但讓應(yīng)用件跳轉(zhuǎn)我知道怎么寫,但是用的我們微信的scheme怎么都跳不過去盈电。查了文檔也是沒有這一塊的知識(shí)點(diǎn)蝴簇,API。今天正好在偶然間看到了跳轉(zhuǎn)微信間的各個(gè)scheme匆帚,才知道原來跳轉(zhuǎn)到微信用的是微信定好的scheme熬词。
如果你對(duì)下面這一塊代碼有疑問,請(qǐng)百度:iOS應(yīng)用件跳轉(zhuǎn)吸重,相信你會(huì)找到答案互拾。
NSString *urlStr = [NSString stringWithFormat:@"weixin://dl/officialaccounts"];
//復(fù)制字符串到剪切板
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string = @"sun yun fei";
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:urlStr]];
這就是跳轉(zhuǎn)的代碼,點(diǎn)擊直接跳轉(zhuǎn)到微信公眾平臺(tái)嚎幸。當(dāng)然這里還是加一句判斷比較好颜矿,判斷一下手機(jī)是否安裝了微信。
后記
這就是我自己做的微信支付與跳轉(zhuǎn)嫉晶,希望對(duì)你有所幫助骑疆。
demo鏈接田篇,大家可以看一下(給個(gè)星星唄,各位看官)箍铭,xcode7.2運(yùn)行環(huán)境下寫的泊柬。