iOS整合微信支付的一些坑:onResp不回撥、只顯示一個確定按鈕、閃回
iOS整合微信支付總體來說還是比較容易的(如果沒有那些坑的話),所有文件都在:
https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_1
甚至只要看:
https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_3
https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_5
這兩部分就可以搞定。
遇到的大部分問題來自於另一個非常常用的第三方:友盟分享
關於
已經集成了友盟分享
只要下載微信sdk,並複製到友盟目錄下的UMSocial_Sdk_Extra_Frameworks/Wechat資料夾中,替換存在檔案。
關於
發起支付之後只顯示一個確定按鈕
就是這樣,沒有任何錯誤提示,斷點返回的Url Schemes,也只有一個ret=-2,官方文件解釋為:
“無需處理。發生場景:使用者不支付了,點選取消,返回APP。”
遇到這個問題,基本就是發起請求的引數傳錯了。
PayReq *request = [[[PayReq alloc] init] autorelease]; request.partnerId = @"10000100"; request.prepayId= @"1101000000140415649af9fc314aa427"; request.package = @"Sign=WXPay"; request.nonceStr= @"a462b76e7436e98e0ed6e13c64b4fd1c"; request.timeStamp= @"1397527777"; request.sign= @"582282D72DD2B03AD892830965F428CB16E7A256"; [WXApi sendReq:request];
對照文件仔細排查吧,一定要注意大小寫,另外,sign簽名時,引數名要用小些(此處官方文件有錯誤,文件寫的用駝峰那種:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_3 步驟3-參與簽名的欄位名,此處感謝 @挨踢實習生) 。
關於
閃回
發起支付後,開啟微信,然後立即返回到了你的程式。
原因是專案同時集成了友盟,註冊微信的方法寫在了初始化友盟分享的前面,調換一下位置即可。
//向微信註冊,需要寫到初始化友盟分享的後面
[WXApi registerApp:@"wx000000000" withDescription:@"**weixinpay"]; //你的微信appid
關於
onResp不回撥
這個問題依然來自跟友盟分享的衝突。雖然友盟提供了一個
+(BOOL)handleOpenURL:(NSURL *)url wxApiDelegate:(id<WXApiDelegate>)wxApiDelegate;
方法,但是通過此方法註冊的delegate並沒有被回撥(這個有可能在不同系統版本,友盟sdk版本上效果不同)。解決方法就是判斷一下回調是不是微信支付:
//url Schemes回撥
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
return [self applicationOpenURL:url];
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [self applicationOpenURL:url];
}
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary*)options
{
return [self applicationOpenURL:url];
}
- (BOOL)applicationOpenURL:(NSURL *)url
{
if([[url absoluteString] rangeOfString:@"wx000000000000://pay"].location == 0) //你的微信開發者appid
return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
else
return [UMSocialSnsService handleOpenURL:url wxApiDelegate:[WXApiManager sharedManager]];
}
如過你遇到其他問題,歡迎加微信探討:lofocus