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中已經定義了代理:
- (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.整合