iOS集成微信支付--Swift

  

微信支付在微信紅包的推進發展勢頭愈來愈猛,甚至有超過支付寶的趨勢,那麼在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

點擊該連接到官方網站下載SDK及Demoapi

連接庫

解壓後的Demo中在文件夾SDKExport下面有 libWeChatSDK.a 、WXApi.h 、 WXApiObject.h 這三個文件。把這三個文件拖到你的項目裏面,並在Bridging-Header.h文件中添加以下兩行代碼。安全

#import "WXApi.h"
#import "WXApiObject.h"

設置URL Types

URL Schema中填寫以前建立的應用的AppID
URL Schema服務器

在Appdelegate中註冊微信支付

WXApi.registerApp(WX_APPID, withDescription: "apppaydemo1.0")

獲取PrePay信息併發起支付請求

微信支付和支付寶支付流程有些不同,微信支付會在真正發起支付請求錢先發起PrePay(預支付)請求,而後利用PrePay發起支付請求。Demo中的PrePay是在客戶端生成的,可是更加安全的方式是在服務端生成PrePay。我這裏是在服務器端獲取Prepay信息的,具體實現請查看文章《OS&Android集成微信支付-Server篇》。返回的PrePay信息結構以下:
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

相關文章
相關標籤/搜索