最近公司的APP需要接入微信支付功能。因為在這之前做了不少功課,所以總體步驟還是比較順利,但是最后在拉起微信App里,總是出現-2錯誤碼。這個地方坑了我好長時間,我相信讀者可能會砬到過這種情況。最后在安卓同事的幫助下總算搞定了,成功進入支付頁面。下面我來總結iOS微信支付的坑。
1: 下載微信支付SDK和Demo,網址微信支付
在這里我不得不吐槽微信支付的Demo開發者,此Demo還是2012年寫的,是用MRC來管理內存,而且這個Demo我一直沒有運行起來。我個人建議不要看這個Demo了,按照我下面的說明配置即可。下載完成后將SDK文件解壓后放到你的項目里。在這里我說明一下,如果你用了友盟的社會化分享并且還支持微信的話,那你就不需要下載微信支付SDK了,直接可以用友盟里面的SDK文件。
2:配置App跳轉的白名單。iOS9 大家都懂的
3:配置iOS UrlSchema,這個作為iOS開發者都知道啦
Url Schema 就是你在申請微信支付的App key
4:添加框架Framework和dylib文件
有時侯添加SDK后項目不能編譯通過,這種通常是你還沒有加入SDK必要的dylib或者framework文件,確保在Link Binary With Libraries里加入以下Library
SystemConfiguration.framework,
libz.dylib,
libsqlite3.0.dylib,
libc++.dylib
CoreTelephony.frame
5 :在AppDelegate文件里面的方法里面微信注冊您的APPID
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[WXApi registerApp:@"此處填入微信分配的APPID"];//一般寫以wx開頭的Id
//[WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"];
return YES;
}
里面的兩個方法使用做任意一個即可
6:獲取訂單的重要信息,這個一般Server的同事會提供。我們需要下面最5個關鍵的屬性:
"appid": "wxb423c568326b71ee",//微信開放平臺審核通過的應用APPID
"partnerId": "1326631501",//微信支付分配的商戶號
"nonceStr": "EStCEnC8lVvIBV10",//隨機字符串
"prepayId": "wx20160601113412a39d0f4d700072397236",//預支付交易會話標識
"sign":"E0A8028B79F4E64885B9D930E6FD88E2" //sign,這個是簽名,但是很有可能這個簽名是有問題的,我用不了
7:生成PayReq對象
PayReq *request = [PayReq new];
request.partnerId = @"1326631501";
request.prepayId= @"wx20160601113412a39d0f4d700072397236";
request.package = @"Sign=WXPay"; //package必定是這個
request.nonceStr= @"EStCEnC8lVvIBV10";
NSDate *datenow = [NSDate date];
NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]];
UInt32 timeStamp =[timeSp intValue];
request.timeStamp= timeStamp; //timeStamp是個十位數字
//request.sign= @"E0A8028B79F4E64885B9D930E6FD88E2";
DataMD5 *md5 = [[DataMD5 alloc] init];
request.sign=[md5 createMD5SingForPay:payInfo.appId partnerid:p.partnerId prepayid:p.prepayId package:p.package noncestr:p.nonceStr timestamp:p.timeStamp];
NSLog(@"%@",p.sign);
[WXApi sendReq:request];
在這里值得說明;對于timeStamp,對當前的時間戳就行。再將其轉成10位數字。
對于sign,在這里有個大坑,如果你直接使用了server返回的sign,那么在調起微信App后,發現這個頁面只有一個確定按鈕,無法實現支付功能,
點了確定按鈕返回App后,給出的錯誤碼中-2,就是是說,用戶取消支付,什么玩意?
這其實就是傳遞接口的字段導致的問題。那么如何解決呢?首先確保以下幾點
- nonceStr是用Server返回的,不要自己生成。
- request.package = @"Sign=WXPay", 這個是死的,不要寫錯。
- timeStamp是個十位數字,不是13位。
- 確定前面所有都沒有錯誤后,很有可能就是sign的問題了。那么我們需要自己完成簽名,也就是說自己生成sign。
生成Sign需要DataMD5類,建議讀者自己下載 WebchatDemo里面有這個類
所傳的參數appId要用Server提供的appId,不要弄錯成其他的了,注意這里還有一個坑,在DataMD5的m文件里面要添加商戶密鑰key字段
[contentString appendFormat:@"key=%@",@"E0A8028B79F4E64885B9D930E6FD88E2"];
- 最后就是sign是全部大寫了
- 還有最后一個問題,就是如果你用了友盟社會化分享來做微信登錄的話,那么你要先用友盟注冊微信,后調用微信SDK注冊
[UMSocialWechatHandler setWXAppId:SHARE_WX appSecret:SHARE_WX_SECRET url:SHAREURL];
[WXApi registerApp:SHARE_WX withDescription:@"demo"];
這下返回碼為-2的問題應該可以解決了,如果還是不行,可以和Server的同事商量返回的屬性有沒有問題。
8:最后還的回調問題,當用戶完成支付或者取消支付,都要跳轉回App,需要在這里處理一下url
if url.host?.compare("pay") == NSComparisonResult.OrderedSame && url.host == "pay" {
WXApi.handleOpenURL(url,delegate: WXApiManager.sharedManager())
return true
}
如果返回的url是pay,那么就是微信支付的跳回。需要調用 WXApi.handleOpenURL來處理,需要把Demo的WXApiManager文件拷貝到項目里面,調用它來處理回調。
上面就是我在開發微信支付SDK遇到的坑了,希望可以幫助大家。