iOS集成微信支付-Swift版

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


URL Schema

在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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末现柠,一起剝皮案震驚了整個濱河市院领,隨后出現的幾起案子,更是在濱河造成了極大的恐慌够吩,老刑警劉巖比然,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異周循,居然都是意外死亡强法,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門湾笛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饮怯,“玉大人,你說我怎么就攤上這事嚎研∷妒纾” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵嘉赎,是天一觀的道長。 經常有香客問我于樟,道長公条,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任迂曲,我火速辦了婚禮靶橱,結果婚禮上,老公的妹妹穿的比我還像新娘路捧。我一直安慰自己关霸,他們只是感情好,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布杰扫。 她就那樣靜靜地躺著队寇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪章姓。 梳的紋絲不亂的頭發(fā)上佳遣,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天识埋,我揣著相機與錄音,去河邊找鬼零渐。 笑死窒舟,一個胖子當著我的面吹牛,可吹牛的內容都是我干的诵盼。 我是一名探鬼主播惠豺,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼风宁!你這毒婦竟也來了洁墙?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤杀糯,失蹤者是張志新(化名)和其女友劉穎扫俺,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體固翰,經...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡狼纬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了骂际。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疗琉。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖歉铝,靈堂內的尸體忽然破棺而出盈简,到底是詐尸還是另有隱情,我是刑警寧澤太示,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布柠贤,位于F島的核電站,受9級特大地震影響类缤,放射性物質發(fā)生泄漏臼勉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一餐弱、第九天 我趴在偏房一處隱蔽的房頂上張望宴霸。 院中可真熱鬧,春花似錦膏蚓、人聲如沸瓢谢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氓扛。三九已至,卻和暖如春论笔,著一層夾襖步出監(jiān)牢的瞬間幢尚,已是汗流浹背破停。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留尉剩,地道東北人真慢。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像理茎,于是被迫代替她去往敵國和親黑界。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,152評論 25 707
  • 實現支付寶支付的準備工作: 1.向支付寶簽約皂林,成為支付寶的商戶 簽約完成后朗鸠,支付寶會提供一些必要的數據給我們 商戶...
    Anson楊春安閱讀 8,206評論 0 6
  • 前言:本篇文章目的在于梳理知識,鞏固思想础倍,學習總結烛占。有什么好的建議,都可以留言沟启∫浼遥互相促進!總觀德迹,微信支付芽卿,也沒心思...
    麥穗0615閱讀 10,047評論 8 70
  • 在被支付寶、銀聯坑過之后胳搞,發(fā)現其實微信支付的集成并沒有想象中的那么困難卸例,像支付寶那樣簡單地調用個方法就行,重要的難...
    petry閱讀 704評論 2 2
  • 默默 就像山頭的磐石 不知從何時佇立 亦不曉佇立多久 遠行 正如谷底的溪流 一心向大海奔去 更堅定奔流方向 我站在...
    丨木木閱讀 160評論 0 0