【微信支付开发流程】
提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
文章目錄
- 場景介紹
- 支付步驟
- 總結
場景介紹
適用于商戶在移動端APP中集成微信支付功能;
商戶APP調用微信提供的SDK調用微信支付模塊,商戶APP會跳轉到微信中完成支付,支付完后跳回到商戶APP內,最后展示支付結果;
目前微信支付支持手機系統有:IOS(蘋果)、Android(安卓)和WP(Windows Phone);
一、支付步驟
步驟1:用戶進入商戶APP,選擇商品下單,確認購買,進入支付環節;商戶服務后臺生成支付訂單,簽名后將數據傳輸到APP端;以微信提供的DEMO為例,如下圖:
?步驟2:用戶點擊后發起支付操作,進入到微信界面,調起微信支付,出現確支付界面,如下圖:
?步驟3:用戶確認收款方和金額,點擊立即支付后出現輸入密碼界面,可選擇零錢或銀行卡支付,如下圖:
?步驟四:輸入正確密碼后,支付完成,用戶端微信出現支付詳情界面,如下圖:
?步驟五:回跳到商戶APP中,商戶APP根據支付結果個性化展示訂單處理結果,如下圖:
?
二、開發指引
以下是交互時序圖,統一下單API,支付結果通知API和查詢等都涉及簽名過程,調用都必須在商戶服務器端完成,如下圖:
?商戶系統和微信支付系統主要交互說明:
步驟1:用戶在商戶APP中選擇商品,提交訂單,選擇微信支付;
步驟2:用戶后臺收到用戶支付訂單,調用微信支付統一下單接口;
統一下單:【https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1】
應用場景
商戶系統先調用該接口在微信支付服務后臺生成預支付交易單,返回正確的預支付交易會話標識后再在APP里面調起支付。
接口鏈接
URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder
是否需要證書
不需要
請求參數
?
?
舉例如下:
?
<xml><appid>wx2421b1c4370ec43b</appid><attach>支付測試</attach><body>APP支付測試</body><mch_id>10000100</mch_id><nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str><notify_url>https://wxpay.wxutil.com/pub_v2/pay/notify.v2.php</notify_url><out_trade_no>1415659990</out_trade_no><spbill_create_ip>14.23.150.211</spbill_create_ip><total_fee>1</total_fee><trade_type>APP</trade_type><sign>0CB01533B8C1EF103065174F50BCA001</sign> </xml>注:參數值XML轉義即可,CDATA標簽用于說明數據不被XML解析器解析
返回結果
以下字段在return_code為 SUCCESS的時候有返回
?以下字段在return_code和result_code都為SUCCESS的時候有返回
舉例如下:
<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg><appid><![CDATA[wx2421b1c4370ec43b]]></appid><mch_id><![CDATA[10000100]]></mch_id><nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str><sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign><result_code><![CDATA[SUCCESS]]></result_code><prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id><trade_type><![CDATA[APP]]></trade_type> </xml>錯誤碼
?
?步驟3:統一下單接口返回正常的prepay_id,再按簽名規范重新生成簽名后,將數據傳輸給APP,參與簽名的字段名為appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式為Sign=WXPay
步驟4:商戶APP調起微信支付;
app端開發步驟說明
【https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5】
APP端開發步驟
IOS系統opensdk升級指引
由于蘋果公司在iOS13系統回收了查詢 App bundleID 的能力,導致微信無法保證授權憑證能正確返回給AppID對應的應用。為此,微信支付強烈要求所有商戶盡快升級到OpenSDK1.8.6,并讓用戶及時更新APP,否則安全風險將一直存在。謝謝配合!
詳細OpenSDK升級指引請參見:opensdk升級指引
注意:opensdk升級后請一定按照文檔要求完成驗證工作,確保opensdk升級成功。
?
?
IOS開發要點說明
以下項目開發環境以Xcode6.0,運行環境為IOS7.0為例,說明其開發中需要的操作。
1、項目設置APPID
商戶在微信開放平臺申請開發APP應用后,微信開放平臺會生成APP的唯一標識APPID。在Xcode中打開項目,設置項目屬性中的URL Schemes為您的APPID。如圖8.7標紅位置所示。
?
2、注冊APPID
商戶APP工程中引入微信lib庫和頭文件,調用API前,需要先向微信注冊您的APPID,代碼如下:
[WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"];
3、調起支付
商戶服務器生成支付訂單,先調用【統一下單API】生成預付單,獲取到prepay_id后將參數再次簽名傳輸給APP發起支付。以下是調起微信支付的關鍵代碼:
PayReq *request = [[[PayReq alloc] init] autorelease]; request.partnerId = @"10000100"; request.prepayId= @"1101000000140415649af9fc314aa427"; request.package = @"Sign=WXPay"; request.nonceStr= @"a462b76e7436e98e0ed6e13c64b4fd1c"; request.timeStamp= @"1397527777"; request.sign= @"582282D72DD2B03AD892830965F428CB16E7A256"; [WXApi sendReq:request];注意:該sign生成字段名列表見調起支付API
4、支付結果回調
照微信SDK Sample,在類實現onResp函數,支付完成后,微信APP會返回到商戶APP并回調onResp函數,開發者需要在該函數中接收通知,判斷返回錯誤碼,如果支付成功則去后臺查詢支付結果再展示用戶實際支付結果。注意 一定不能以客戶端返回作為用戶支付的結果,應以服務器端的接收的支付通知或查詢API返回的結果為準。代碼示例如下:
-(void)onResp:(BaseResp*)resp{if ([respisKindOfClass:[PayRespclass]]){PayResp*response=(PayResp*)resp;switch(response.errCode){caseWXSuccess://服務器端查詢支付通知或查詢API返回的結果再提示成功NSlog(@"支付成功");break;default:NSlog(@"支付失敗,retcode=%d",resp.errCode);break;}}}回調中errCode值列表:
?
Android開發要點說明
1、后臺設置
商戶在微信開放平臺申請開發應用后,微信開放平臺會生成APP的唯一標識APPID。由于需要保證支付安全,需要在開放平臺綁定商戶應用包名和應用簽名,設置好后才能正常發起支付。設置界面在【開放平臺】中的欄目【管理中心 / 修改應用 / 修改開發信息】里面,如圖8.8紅框內所示。
?
應用包名:是在APP項目配置文件AndroidManifest.xml中聲明的package值,例如DEMO中的package="net.sourceforge.simcpux"。
應用簽名:根據項目的應用包名和編譯使用的keystore,可由簽名工具生成一個32位的md5串,在調試的手機上安裝簽名工具后,運行可生成應用簽名串,如圖8.9所示,綠色串即應用簽名。簽名工具下載地址https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apkhttps://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk
?
2、注冊APPID
商戶APP工程中引入微信JAR包,調用API前,需要先向微信注冊您的APPID,代碼如下:
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// 將該app注冊到微信
msgApi.registerApp("wxd930ea5d5a258f4f");
3、調起支付
商戶服務器生成支付訂單,先調用統一下單API(詳見第7節)生成預付單,獲取到prepay_id后將參數再次簽名傳輸給APP發起支付。以下是調起微信支付的關鍵代碼:
IWXAPI api; PayReq request = new PayReq(); request.appId = "wxd930ea5d5a258f4f"; request.partnerId = "1900000109"; request.prepayId= "1101000000140415649af9fc314aa427"; request.packageValue = "Sign=WXPay"; request.nonceStr= "1101000000140429eb40476f8896f4c9"; request.timeStamp= "1398746574"; request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B"; api.sendReq(request);注意:該sign生成字段名列表見調起支付APIhttps://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2
4、支付結果回調
參照微信SDK Sample,在net.sourceforge.simcpux.wxapi包路徑中實現WXPayEntryActivity類(包名或類名不一致會造成無法回調),在WXPayEntryActivity類中實現onResp函數,支付完成后,微信APP會返回到商戶APP并回調onResp函數,開發者需要在該函數中接收通知,判斷返回錯誤碼,如果支付成功則去后臺查詢支付結果再展示用戶實際支付結果。注意一定不能以客戶端返回作為用戶支付的結果,應以服務器端的接收的支付通知或查詢API返回的結果為準。代碼示例如下:
public void onResp(BaseRespresp){if(resp.getType()==ConstantsAPI.COMMAND_PAY_BY_WX){Log.d(TAG,"onPayFinish,errCode="+resp.errCode);AlertDialog.Builderbuilder=newAlertDialog.Builder(this);builder.setTitle(R.string.app_tip);} }回調中errCode值列表:
?步驟5:商戶后臺接受支付通知;
支付結果通知
應用場景
支付完成后,微信會把相關支付結果及用戶信息通過數據流的形式發送給商戶,商戶需要接收處理,并按文檔規范返回應答。
注意:1、同樣的通知可能會多次發送給商戶系統。商戶系統必須能夠正確處理重復的通知。
2、后臺通知交互時,如果微信收到商戶的應答不符合規范或超時,微信會判定本次通知失敗,重新發送通知,直到成功為止(在通知一直不成功的情況下,微信總共會發起多次通知,通知頻率為15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 總計 24h4m),但微信不保證通知最終一定能成功。
3、在訂單狀態不明或者沒有收到微信支付結果通知的情況下,建議商戶主動調用微信支付【查詢訂單APIhttps://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_2&index=4】確認訂單狀態。
特別提醒:1、商戶系統對于支付結果通知的內容一定要做簽名驗證,并校驗返回的訂單金額是否與商戶側的訂單金額一致,防止數據泄露導致出現“假通知”,造成資金損失。
2、當收到通知進行處理時,首先檢查對應業務數據的狀態,判斷該通知是否已經處理過,如果沒有處理過再進行處理,如果處理過直接返回結果成功。在對業務數據進行狀態檢查和處理之前,要采用數據鎖進行并發控制,以避免函數重入造成的數據混亂。
3、技術人員可登進微信商戶后臺掃描加入接口報警群,獲取接口告警信息。
?
接口鏈接
該鏈接是通過【統一下單APIhttps://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1】中提交的參數notify_url設置,如果鏈接無法訪問,商戶將無法接收到微信通知。
通知url必須為直接可訪問的url,不能攜帶參數。公網域名必須為https,如果是走專線接入,使用專線NAT IP或者私有回調域名可使用http。示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.action”
是否需要證書
不需要。
通知參數
?以下字段在return_code為SUCCESS的時候有返回
?
?
?舉例如下:
<xml><appid><![CDATA[wx2421b1c4370ec43b]]></appid><attach><![CDATA[支付測試]]></attach><bank_type><![CDATA[CFT]]></bank_type><fee_type><![CDATA[CNY]]></fee_type><is_subscribe><![CDATA[Y]]></is_subscribe><mch_id><![CDATA[10000100]]></mch_id><nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str><openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid><out_trade_no><![CDATA[1409811653]]></out_trade_no><result_code><![CDATA[SUCCESS]]></result_code><return_code><![CDATA[SUCCESS]]></return_code><sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign><time_end><![CDATA[20140903131540]]></time_end><total_fee>1</total_fee><coupon_fee><![CDATA[10]]></coupon_fee><coupon_count><![CDATA[1]]></coupon_count><coupon_type><![CDATA[CASH]]></coupon_type><coupon_id><![CDATA[10000]]></coupon_id><trade_type><![CDATA[JSAPI]]></trade_type><transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id> </xml>返回參數
商戶處理后同步返回給微信參數:
舉例如下:
<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg> </xml>步驟6:商戶后臺查詢支付結果;
查詢訂單
應用場景
該接口提供所有微信支付訂單的查詢,商戶可以通過該接口主動查詢訂單狀態,完成下一步的業務邏輯。
需要調用查詢接口的情況:
接口鏈接
https://api.mch.weixin.qq.com/pay/orderquery
是否需要證書
不需要
請求參數
?舉例如下:
<xml><appid>wx2421b1c4370ec43b</appid><mch_id>10000100</mch_id><nonce_str>ec2316275641faa3aacf3cc599e8730f</nonce_str><transaction_id>1008450740201411110005820873</transaction_id><sign>FDD167FAA73459FD921B144BAF4F4CA2</sign> </xml>返回結果
?以下字段在return_code為SUCCESS的時候有返回
以下字段在return_code?和result_code都為SUCCESS的時候有返回
交易成功判斷條件:?return_code、result_code和trade_state都為SUCCESS
?舉例如下:
<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg><appid><![CDATA[wx2421b1c4370ec43b]]></appid><mch_id><![CDATA[10000100]]></mch_id><device_info><![CDATA[1000]]></device_info><nonce_str><![CDATA[TN55wO9Pba5yENl8]]></nonce_str><sign><![CDATA[BDF0099C15FF7BC6B1585FBB110AB635]]></sign><result_code><![CDATA[SUCCESS]]></result_code><openid><![CDATA[oUpF8uN95-Ptaags6E_roPHg7AG0]]></openid><is_subscribe><![CDATA[Y]]></is_subscribe><trade_type><![CDATA[APP]]></trade_type><bank_type><![CDATA[CCB_DEBIT]]></bank_type><total_fee>1</total_fee><fee_type><![CDATA[CNY]]></fee_type><transaction_id><![CDATA[1008450740201411110005820873]]></transaction_id><out_trade_no><![CDATA[1415757673]]></out_trade_no><attach><![CDATA[訂單額外描述]]></attach><time_end><![CDATA[20141111170043]]></time_end><trade_state><![CDATA[SUCCESS]]></trade_state> </xml>錯誤碼
?
總結
?
用戶在商戶系統后臺進行下單,發起支付,在商戶系統后臺生成訂單,商戶系統后臺向微信支付系統發起請求下單接口,創建訂單,在微信支付系統生成預付單,微信支付系統將生成的預付單標識返回給商戶系統后臺,在商戶后臺系統生成帶簽名的支付信息,此時用戶向商戶系統后臺發起支付,之后商戶系統后臺向微信客戶端調起微信支付,微信客戶端向微信支付系統發起支付請求,微信支付系統進行驗證支付授權權限,微信支付系統將支付授權返回給微信客戶端,此時用戶向微信客戶端進行確認支付,輸入密碼,之后微信客戶端向微信支付系統提交授權,微信支付系統進行驗證授權,通過之后微信支付系統將異步通知平臺支付結果返回給商戶系統后臺,在商戶系統后臺進行保存支付通知,之后商戶系統后臺將返回告知成功接受處理返回給微信支付系統,微信支付系統將返回支付結果,并發微信消息提醒給微信客戶端,此時微信客戶端將去商戶系統后臺進行支付狀態查詢,商戶系統后臺向微信支付系統調用查單接口,查詢支付結果,微信支付系統想商戶系統后臺返回支付結果,最后商戶系統后臺向用戶展示支付信息;
總結
以上是生活随笔為你收集整理的【微信支付开发流程】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: django使用用户名或手机号码登录
- 下一篇: hackerrank答案