微信支付在微信紅包的推進發展勢頭愈來愈猛,甚至有超過支付寶的趨勢,那麼在App集成微信支付也是比不可少了。我最近在一個項目中集成微信支付遇到了很多問題,Google了很多資料才搞定,不得不吐槽一下微信支付的官方接口文檔,實在太簡陋了。我但願這篇文章可以幫到須要在iOS APP中集成微信支付的朋友。php
若是不想看文章能夠直接到Github下載Demo源碼。下載源碼後只須要修改MyConstants.swift文件中的微信支付相關帳號便可運行。android
整個支付流程我在文章《手機App集成微信支付&支付寶-iOS&Android完整版》中有詳細描述,這裏再也不重複。ios
要在App中集成微信支付的話,首先須要到微信開放平臺註冊開發者帳號。注意是「微信開放平臺」,而不是「微信公衆平臺」。微信公衆平臺是和公衆號開發相關,微信開放平臺提供App微信登錄,微信支付等接口。 想詳細瞭解微信支付的同窗請點擊此連接訪問官方文檔。
帳號註冊完成後還須要經過開發者資質認證後,才能得到微信登陸、智能接口、公衆號第三方平臺開發等高級能力。認證費用是300元/年,一年到期後再交錢審覈。目前微信只支持企業認證,我的開發者是沒法認證的。git
要獲取支付權限,還須要登錄「微信商戶平臺」 和騰訊簽約。簽約須要掃描上傳「營業執照」、「組織機構代碼證」、「經營許可證/資格證」、「身份證」等信息。在微信商戶平臺能夠進行查詢交易訂單,提現等功能。在此須要說明一下的是,微信商戶平臺和財付通數據實際上是通的,在微信和財付通均可以看到一樣的交易記錄。github
登陸微信開放平臺,進入管理中心,建立移動應用。建立完成後你將獲得應用的AppID和AppSecret。建立完應用之後還須要設置「開發信息」
點擊「修改」,設置好Bundle ID、Appstore下載地址等信息。swift
點擊該連接到官方網站下載SDK及Demoapi
解壓後的Demo中在文件夾SDKExport下面有 libWeChatSDK.a 、WXApi.h 、 WXApiObject.h 這三個文件。把這三個文件拖到你的項目裏面,並在Bridging-Header.h文件中添加以下兩行代碼。安全
#import "WXApi.h" #import "WXApiObject.h"
URL Schema中填寫以前建立的應用的AppID
服務器
WXApi.registerApp(WX_APPID, withDescription: "apppaydemo1.0")
微信支付和支付寶支付流程有些不同,微信支付會在真正發起支付請求錢先發起PrePay(預支付)請求,而後利用PrePay發起支付請求。Demo中的PrePay是在客戶端生成的,可是更加安全的方式是在服務端生成PrePay。我這裏是在服務器端獲取Prepay信息的,具體實現請查看文章《OS&Android集成微信支付-Server篇》。返回的PrePay信息結構以下:
微信
@IBAction func weichatPayAction(sender: AnyObject) { DataService.wxPrePay(order.id) {[weak self] (prepay, error) -> () in if let strongSelf = self { if let prepay = prepay { let req = PayReq() req.openID = prepay.appID req.partnerId = prepay.partnerID req.prepayId = prepay.prepayID req.nonceStr = prepay.noncestr req.timeStamp = UInt32(prepay.timestamp) req.package = prepay.package req.sign = prepay.sign WXApi.sendReq(req) } else { strongSelf.delegate?.paymentFail(paymentType: .Weichat) let alert = UIAlertView(title: nil, message: "獲取支付信息失敗,請從新支付!", delegate: nil, cancelButtonTitle: "好的") alert.show() } } } }
App支付完成後返回App, 在Appdelegate中實現協議 WXApiDelegate 中的 onResp方法
func onResp(resp: BaseResp!) { var strTitle = "支付結果" var strMsg = "\(resp.errCode)" if resp.isKindOfClass(PayResp) { switch resp.errCode { case 0 : NSNotificationCenter.defaultCenter().postNotificationName(WXPaySuccessNotification, object: nil) default: strMsg = "支付失敗,請您從新支付!" print("retcode = \(resp.errCode), retstr = \(resp.errStr)") } } let alert = UIAlertView(title: nil, message: strMsg, delegate: nil, cancelButtonTitle: "好的") alert.show() }
若是支付成功後,微信服務器會向你的服務器 notify URL 發起支付成功的請求。這樣就能夠在服務端實現一些相關的業務邏輯,好比標機訂單爲已支付,發短信給用戶等。notify URL的具體實現請查看文章《OS&Android集成微信支付-Server篇》
若是遇到相似 "WXApiObject.h error:Expected a type : - (void) setThumbImage:(UIImage*) image;" 的錯誤,打開文件WXApiObject.h,在頂部加上 #import <UIKit/UIKit.h> 便可
iOS9之後蘋果默認使用HTTPS,若是服務器端是HTTP協議,那麼就須要在 info.plist 中添加Key:NSAppTransportSecurity, Value設置爲 NSAllowsArbitraryLoads
若是你同時用了ShareSDK,那麼頗有可能會和ShareSDK衝突,致使不能跳轉到微信。解決方案就是用微信sdk中的內容替代ShareSDK/extends/WeChatSDK 目錄下的文件libWeChatSDK.a, WXApi.h, WXApiObject.h
查看完整代碼請移步Github