iOS微信支付填坑記

最近公司的APP需要接入微信支付功能。因為在這之前做了不少功課,所以總體步驟還是比較順利,但是最后在拉起微信App里,總是出現-2錯誤碼。這個地方坑了我好長時間,我相信讀者可能會砬到過這種情況。最后在安卓同事的幫助下總算搞定了,成功進入支付頁面。下面我來總結iOS微信支付的坑。

1: 下載微信支付SDK和Demo,網址微信支付

在這里我不得不吐槽微信支付的Demo開發者,此Demo還是2012年寫的,是用MRC來管理內存,而且這個Demo我一直沒有運行起來。我個人建議不要看這個Demo了,按照我下面的說明配置即可。下載完成后將SDK文件解壓后放到你的項目里。在這里我說明一下,如果你用了友盟的社會化分享并且還支持微信的話,那你就不需要下載微信支付SDK了,直接可以用友盟里面的SDK文件。

2:配置App跳轉的白名單。iOS9 大家都懂的

App跳轉白名單

3:配置iOS UrlSchema,這個作為iOS開發者都知道啦

Url Schema 就是你在申請微信支付的App key


配置URL Types

4:添加框架Framework和dylib文件

有時侯添加SDK后項目不能編譯通過,這種通常是你還沒有加入SDK必要的dylib或者framework文件,確保在Link Binary With Libraries里加入以下Library


添加需要的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字段
要注意在加密的方法里添加商戶密鑰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遇到的坑了,希望可以幫助大家。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,285評論 25 708
  • 實現支付寶支付的準備工作: 1.向支付寶簽約,成為支付寶的商戶 簽約完成后,支付寶會提供一些必要的數據給我們 商戶...
    Anson楊春安閱讀 8,258評論 0 6
  • 自己總結的微信支付寶支付流程和注意點: 準備工作: 需要公司的營業執照,稅務信息,等老板的身份證信息等,我記得,用...
    Www劉閱讀 18,588評論 2 50
  • 我和暗戀的他,還維持著朋友圈可以互訪的關系。 去年年末,孕四個月,孕激素的折磨讓我毫無愛美心思,隨便穿件衣服攏攏頭...
    沵新閱讀 250評論 0 1
  • 柳嘆云愁山海郁,蓮頹雨倦老生眠。 孤憑數載修心志,自遣三關鏡月憐。 ???
    瀟寒月閱讀 381評論 4 3