1. 程式人生 > >iOS 微信支付整合

iOS 微信支付整合

1. 準備

微信平臺分為微信公眾平臺微信開放平臺,公眾平臺是運營微信公眾號的管理系統,開放平臺主要針對app、網站開發,提供登入、分享、支付等功能。

註冊開放平臺之後,新建應用,填寫應用資訊(Android、iOS等資訊),建立之後需要等待稽核(這個稽核很快的,幾個小時就通過了)。

然後是為該應用申請支付功能,要注意個人是無法申請的,具體可參考微信支付申請條件和資格。這裡牽涉到一系列公司資質的稽核和費用支付,需要幾個工作日的時間

完成之後可以獲取到appid(微信開放平臺為應用生成的唯一識別碼)、商戶id、商戶secretKey。對於app端來說只用到appid,商戶id最好通過介面從server獲取,商戶secretKey是用來簽名的,一般只有server能用到。

2. 支付流程

先上一個開放平臺給出的流程圖:


支付流程.png

這個圖很實用很詳細很清晰,但一開始看可能會覺得複雜。其實對開發者來說,比較關心的流程是:

app向server發起支付請求

server收到請求後向微信後臺呼叫統一下單API,獲得預付單資訊

server生成帶簽名的客戶端支付資訊並返回給app

使用者確認支付,app調起微信客戶端進行支付

app獲得支付結果後向server查詢最終結果並顯示

流程瞭解之後,瞭解下需要定義的介面和前後端的具體工作:

新介面:

app向server發起請求,獲得簽名後的app支付資訊

app支付之後向server查詢支付結果(微信回撥的結果不可信,必須以server的結果為準)

app需要做的:

專案接入微信支付sdk

向server請求支付資訊

用支付資訊調起微信客戶端,然後支付

收到微信回撥之後向server查詢支付結果

根據支付結果展示頁面

server需要做的:

收到app端支付請求後呼叫統一下單API向微信後臺獲取預支付資訊

將app端需要的支付資訊簽名之後返回給app

接收微信後臺回撥資訊(支付結果),以供app查詢

3. iOS開發

下載並執行demo

其實把demo看明白了,直接運用到自己的app裡,也不是不可以的

設定專案

在Xcode中,projectName-->Info-->URL Types 新增appid。設定之後才能實現應用間跳轉


urltypes.png

匯入sdk


sdk.png

如果使用了pod,直接在Podfile中新增pod 'WechatOpenSDK' 然後執行 pod update即可。如果沒有使用pod,在添加了sdk檔案包之後,需要在pojectName-->General-->Linked Frameworks and Libraries 中新增相應內容


libs.png

程式碼

AppDelegate.m

didFinishLaunchingWithOptions方法中

[WXApi registerApp:@"wx000999888777"];//註冊appid

openUrl、handleOpenURL方法

- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url {

return[WXApi handleOpenURL:url delegate:[PaymentManager sharedManager]];}

- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation {

return[WXApi handleOpenURL:url delegate:[PaymentManager sharedManager]];

}

//NOTE:9.0以後使用新API介面

- (BOOL)application:(UIApplication*)app openURL:(NSURL*)url options:(NSDictionary *)options{

return[WXApi handleOpenURL:url delegate:[PaymentManager sharedManager]];

}

如果之前專案中使用了友盟等第三方框架,直接並排寫就可以:

- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url{    [WXApi handleOpenURL:url delegate:[PaymentAction sharedPayment]];    [UMSocialSnsService handleOpenURL:url];returnYES;}

另外,這個地方的delegate也可以直接設定成nil,表示用當前AppDelegate作為微信支付的代理,這樣一來支付回撥寫在AppDelegate.m中即可。

但不推薦這種做法,我是設定了PaymentManager作為代理,這是專案中專門管理支付的一個類,包括之前的支付寶支付。這也是微信demo中的做法。(支付寶是用block獲取回撥的,個人感覺程式碼更緊湊,不容易亂;微信是用的代理,剛開始看暈乎乎的)

PaymentManager

首先是遵守協議WXApiDelegate

然後在PayVC中通過介面獲取支付資訊

然後調起微信客戶端:

- (void)weiXinPayWithDic:(NSDictionary *)wechatPayDic {   

     PayReq *req = [[PayReq alloc] init];   

     req.openID = [wechatPayDic objectForKey:@"appId"];   

     req.partnerId = [wechatPayDic objectForKey:@"partnerId"];  

      req.prepayId = [wechatPayDic objectForKey:@"prepayId"];  

      req.package= [wechatPayDic objectForKey:@"packages"];   

     req.nonceStr = [wechatPayDic objectForKey:@"nonceStr"];   

     req.timeStamp = [[wechatPayDic objectForKey:@"timesTamp"] intValue];

       req.sign = [wechatPayDic objectForKey:@"sign"];  

      [WXApi sendReq:req];

}

這裡的資料wechatPayDic一定是server經過二次簽名的

回撥

// 微信支付返回結果回撥

- (void)onResp:(BaseResp *)resp {if([resp isKindOfClass:[PayRespclass]]) {   

             PayResp *response = (PayResp *)resp;

if(_delegate && [_delegate respondsToSelector:@selector(managerDidRecvPaymentResponse:)]) {    

        [_delegate managerDidRecvPaymentResponse:response];      

  }  

  }}

當然前提是在PaymentManager.h中已經定義了代理:

@[email protected]

- (void)managerDidRecvPaymentResponse:(PayResp *)response;@[email protected]:[email protected](nonatomic,assign)id delegate;

這個代理是用來處理回撥結果,展示頁面的,所以設定成PayVC控制器

處理回撥結果

PayVC.m

遵守協議WXApiManagerDelegate

在viewDidLoad中設定[PaymentManager sharedManager].delegate = self;

- (void)managerDidRecvPaymentResponse:(PayResp *)response {switch(response.errCode) {

caseWXSuccess:                [selfcheckWechatPayResult];break;caseWXErrCodeUserCancel:          

      [[HintManager shareManager] showHint:@"中途取消"];break;default:{        

        [[HintManager shareManager]showHint:@"支付失敗"];       

     }break;     

   }}

然後在checkWechatPayResult向server查詢支付結果,重新整理頁面

哦了~~ 潑佛客特

4. 出現的問題

當然了,並不潑佛客特

系統版本大於等於iOS9的,調起微信客戶端之後,可以直接點選狀態列左側按鈕返回,這時是不走回調方法的。

這樣在支付成功之後,不走回調方法,就無法知道支付狀態,當前頁面無法給出提示。

解決方案是,在AppDelegate.m的applicationWillEnterForeground方法中,呼叫查詢支付結果介面然後重新整理當然頁面。需要設定bool變數作為標誌,否則每次應用進入前臺都去查詢,就不符合業務要求了。

進入微信支付頁面之後,不做操作,切換到自己應用中,退出當前支付頁面,然後再進入微信客戶端點選支付或者取消,此時自己的應用會崩潰閃退

原因是退出頁面後頁面已經出棧被銷燬,但wx回撥時還是去呼叫其中的代理方法,就會出現野指標。

解決方法是,在頁面的viewWillDisappear方法中加入[PaymentManager sharedManager].delegate = nil;。

5. 需要注意的點

一定設定好scheme,否則應用無法跳轉

在調起微信支付使用的PayReq類,一定要用WXApi中自帶的類,不要自己建立新類。我之前自己建立的類,定義了同樣的變數,同樣繼承了BaseReq,然並卵,sendReq方法一直返回false

調起微信支付的資料,一定是server經過二次簽名的,不要把呼叫統一下單API獲取到的資料直接返給app

雖然類中的變數命名是駝峰式,但簽名時的key值全部是小寫的,簽名時不要忘了後面加上商戶key。

6. 簽名

可能某些server端由於這樣那樣的原因不願意做二次簽名,app可以自己做。(不過因為簽名需要用到secretKey,讓app端做簽名是有風險的)

下面是簽名程式碼:



個人建議像微信支付、支付寶支付最後都由後臺完成,提交相應的資料給後臺,讓後臺生成訂單並返回以下引數就可以了,這樣微信就會非同步通知後臺  支付完成後返回APP  由APP直接向後臺請求訂單支付成功了沒有, 這樣可以保證支付不會出現一些小問題  


相關推薦

iOS 支付整合

1. 準備微信平臺分為微信公眾平臺和微信開放平臺,公眾平臺是運營微信公眾號的管理系統,開放平臺主要針對app、網站開發,提供登入、分享、支付等功能。註冊開放平臺之後,新建應用,填寫應用資訊(Android、iOS等資訊),建立之後需要等待稽核(這個稽核很快的,幾個小時就通過了

React Native (IOS和Android) 支付寶和支付整合實戰(支付寶Android篇)

序言:React Native無論是在社群和應用程度上,在國內外是十分廣泛和普及的。而支付寶和微信在支付模組上都有或多或少的支援,雖然沒有完整的Demo,不過在我做過一個相關整合的專案後,在此我把相關的步驟和方法總結出來和大家分享,希望能夠幫助大家少走彎路,快速整合。 支付

React Native (IOS和Android) 支付寶和支付整合實戰(IOS篇)

序言:React Native無論是在社群和應用程度上,在國內外是十分廣泛和普及的。而支付寶和微信在支付模組上都有或多或少的支援,雖然沒有完整的Demo,不過在我做過一個相關整合的專案後,在此我把相關的步驟和方法總結出來和大家分享,希望能夠幫助大家少走彎路,快速整合。 微信

iOS 支付SDK與友盟分享兩者同時整合時,出現的問題與解決之路。

這兩天改版一箇舊的APP,要舊貌換新顏,拿到app後進行編譯,一直報下面的錯誤。 報不認識的符號名PayReq錯誤。奇怪,啥也沒動就這樣,真不知道給的包是不是本來就是個報錯的工程。 不管怎樣,要對它修改就先要跑起來啊。   根據錯誤提示,判斷是libwec

React Native (IOS和Android) 支付寶和支付整合實戰(支付服務端篇)

序言:React Native無論是在社群和應用程度上,在國內外是十分廣泛和普及的。而支付寶和微信在支付模組上都有或多或少的支援,雖然沒有完整的Demo,不過在我做過一個相關整合的專案後,在此我把相關的步驟和方法總結出來和大家分享,希望能夠幫助大家少走彎路,快速整合。 微信

React Native (IOS和Android) 支付寶和支付整合實戰(支付寶服務端篇)

序言:React Native無論是在社群和應用程度上,在國內外是十分廣泛和普及的。而支付寶和微信在支付模組上都有或多或少的支援,雖然沒有完整的Demo,不過在我做過一個相關整合的專案後,在此我把相關的步驟和方法總結出來和大家分享,希望能夠幫助大家少走彎路,快速整合。 支

iOS支付demo運行報錯解決如下

art llb readme ring -objc override 項目 技術 cep 要接入微信支付的小夥伴,首先要下載一份官方demo(APP微信支付官方Demo下載),然後打開工程,準備大幹一場。 1、編譯報錯 編譯的時候居然直接報錯了(orz) 錯誤提示:

App 支付出現 IOS 支付驗證簽名失敗 Android errCode =-1

遇到這個問題讓我很憂傷,排查了一下午 記得檢查 app_Key , 就是讓你自己寫的32位大小寫外加數字的那個,這個開始我自己亂寫的,後來查資料說可能會引起不能支付,這就很尷尬了。生成MD532 位,後來試了試,其實沒事,但是最好這樣吧,避免不必要的錯誤 公司可能申請了

.NET支付整合例項

轉自https://blog.csdn.net/u013385913/article/details/46509631 微信端HTML頁面下單事件: document.getElementById('btn-wxpay')addEventListener('tap', function (e

Spring Boot入門教程(四十):支付整合-刷卡支付

一:準備工作 使用微信支付需要先開通服務號,然後還要開通微信支付,最後還要配置一些開發引數,過程比較多。 二:支付方式 刷卡支付(MICROPAY) :刷卡支付是使用者展示微信錢包內的“刷卡條碼/二維碼”給商戶系統掃描後直接完成支付的模式。主要應

iOS 支付SDK與友盟分享兩者同時集成時,出現的問題與解決之路。

說明 圖片 根據 red googl 包含 沒有 終端 手動添加 這兩天改版一個舊的APP,要舊貌換新顏,拿到app後進行編譯,一直報下面的錯誤。 報不認識的符號名PayReq錯誤。奇怪,啥也沒動就這樣,真不知道給的包是不是本來就是個報錯的工程。 不管怎樣,要對它修改就先要

iOS 支付,APPID未關聯PaySignKey

最近整合微信支付,iOS正常匯入庫,調起微信的時候出現這麼個情況 原因呢可能是因為後臺沒仔細看文件   prepayid這個欄位是訂單號,需要後臺調微信介面來獲取,正常應該長這個樣子prepayid=wx03162103469366a9464a766c37125

Android學習之 移動應用支付整合小結

       微信支付現在主要整合在:1、移動應用開發  2、網站應用開發  3、公眾賬號開發        本篇主要針對移動應用App整合微信支付,實際專案坑點分享! 一、既予之、與共之:平臺資源 3、微信支付指引和資源中心:微信支付接入指南和資源下載中心<強

iOS 支付接入最新的完整流程

前段時間,公司業務需要接入微信支付,博主就苦心鑽研了2天,終於搞通了,但最近 iOS 9 更新出來後,微信支付,又不可以使用了,具體解決方案我在後面會給出。當然,微信接入也有不少的坑啊 說多了全是淚,

Android支付整合和踩過的坑

近公司需要微信支付,所以不得不去看看微信支付文件。但是你懂得,那文件寫的真帶勁,看不懂。我直接放棄,開始整合。但是調起微信支付的時候:結果碼為-1,心裡一驚,肯定哪裡錯了,就開始找坑。所以把自己解決的過程分享給大家,讓整合微信支付成為很容易的一件事。 2、我們需要的資源

iOS支付開通具體申請步驟

本文章只記錄微信開放平臺註冊應用,稽核過程的具體步驟。接入微信支付SDK程式碼部分,參考微信開放平臺具體相關文件即可 2.建立移動應用:需要UI提供兩種尺寸的圖片  大概三個工作日左右,稽核通過,稽核通過之後就可以獲取應用的AppID,AppS

thinkphp5 的支付整合

下載地址:連結: https://pan.baidu.com/s/1eRUkvtC 密碼: eu98 原作者的:連結: https://pan.baidu.com/s/1dFyE4t7 密碼: s9a7 下載後直接解壓至extend目錄下 然後去公共函式庫common寫一個

IOS-支付

今天博主有一個微信支付的需求,遇到了一些困難點,在此和大家分享,希望能夠共同進步. 1.申請AppID,匯入依賴庫,配置URL Scheme這裡就不深究了,各位看官請自行百度. 2.在AppDelegate中匯入標頭檔案,遵守WXApiDelegate,然後在launch裡註冊AppID. 3.在支付介面匯

Android 支付寶和支付整合

場景 隨著移動支付的興起,在我們的app中,會經常有整合支付的需求.這時候一般都會採用微信和支付寶的sdk 來整合 支付寶支付 在使用支付寶支付的過程中,我們是在伺服器端生成訂單,客戶端訪問介面,得到訂單資訊.然後調起支付,支付成功後支付寶會分別 非同步呼叫伺服器端

Android 支付整合重點(已經看過官方開發文件)

整合微信支付重點,適用於有整合經驗並且已經看過開發文件的同學 1.申請開通 按照官方文件步驟 (註冊平臺賬號——認證(300 如果失敗3次需再付300認證,資訊提前確認)——建立應用稽核(簽名用微信的提取工具)——開通支付功能——整合) 2.整合