iOS集成微信支付-Swift版
微信支付在微信紅包的推動發(fā)展勢頭越來越猛朗兵,甚至有超過支付寶的趨勢冗美,那么在App集成微信支付也是比不可少了蛤吓。我最近在一個項目中集成微信支付遇到了不少問題,Google了不少資料才搞定顺少,不得不吐槽一下微信支付的官方接口文檔,實在太簡陋了。我希望這篇文章能夠幫到需要在iOS APP中集成微信支付的朋友氓辣。
如果不想看文章可以直接到Github下載Demo源碼梭稚。下載源碼后只需要修改MyConstants.swift文件中的微信支付相關賬號即可運行莺戒。
整個支付流程我在文章《手機App集成微信支付&支付寶-iOS&Android完整版》中有詳細描述价认,這里不再重復。
開發(fā)者賬號
要在App中集成微信支付的話惠奸,首先需要到微信開放平臺注冊開發(fā)者賬號梅誓。注意是「微信開放平臺」,而不是「微信公眾平臺」佛南。微信公眾平臺是和公眾號開發(fā)相關梗掰,微信開放平臺提供App微信登陸,微信支付等接口嗅回。 想詳細了解微信支付的同學請點擊此鏈接訪問官方文檔及穗。
賬號注冊完成后還需要通過開發(fā)者資質認證后,才能獲得微信登錄绵载、智能接口埂陆、公眾號第三方平臺開發(fā)等高級能力苛白。認證費用是300元/年,一年到期后再交錢審核焚虱。目前微信只支持企業(yè)認證购裙,個人開發(fā)者是無法認證的。
微信商戶平臺
要獲取支付權限著摔,還需要登陸「微信商戶平臺」 和騰訊簽約缓窜。簽約需要掃描上傳「營業(yè)執(zhí)照」、「組織機構代碼證」谍咆、「經營許可證/資格證」禾锤、「身份證」等信息。在微信商戶平臺可以進行查詢交易訂單摹察,提現等功能恩掷。在此需要說明一下的是,微信商戶平臺和財付通數據其實是通的供嚎,在微信和財付通都可以看到同樣的交易記錄黄娘。
創(chuàng)建應用
登錄微信開放平臺,進入管理中心克滴,創(chuàng)建移動應用逼争。創(chuàng)建完成后你將得到應用的AppID和AppSecret。創(chuàng)建完應用以后還需要設置「開發(fā)信息」
點擊「修改」劝赔,設置好Bundle ID誓焦、Appstore下載地址等信息。
下載SDK
點擊該鏈接到官方網站下載SDK及Demo
鏈接庫
解壓后的Demo中在文件夾SDKExport下面有 libWeChatSDK.a 着帽、WXApi.h 杂伟、 WXApiObject.h 這三個文件。把這三個文件拖到你的項目里面,并在Bridging-Header.h文件中添加如下兩行代碼仍翰。
#import "WXApi.h"
#import "WXApiObject.h"
設置URL Types
URL Schema中填寫之前創(chuàng)建的應用的AppID
在Appdelegate中注冊微信支付
WXApi.registerApp(WX_APPID, withDescription: "apppaydemo1.0")
獲取PrePay信息并發(fā)起支付請求
微信支付和支付寶支付流程有些不一樣赫粥,微信支付會在真正發(fā)起支付請求錢先發(fā)起PrePay(預支付)請求,然后利用PrePay發(fā)起支付請求予借。Demo中的PrePay是在客戶端生成的越平,但是更加安全的方式是在服務端生成PrePay。我這里是在服務器端獲取Prepay信息的蕾羊,具體實現請查看文章《OS&Android集成微信支付-Server篇》喧笔。返回的PrePay信息結構如下:
{
"appid": "wxxxxxxxxxxx",
"noncestr": "Hk8dsZoMOdTXGjkJ",
"package": "Sign=WXPay",
"partnerid": "1220000000",
"prepayid": "wx2016020000000000000000000000",
"sign": "B4879FFFA8B65522A04034E2D027A3B8",
"timestamp": "1454333428",
"success": true
}
獲取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 發(fā)起支付成功的請求利凑。這樣就可以在服務端實現一些相關的業(yè)務邏輯浆劲,比如標機訂單為已支付嫌术,發(fā)短信給用戶等。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