小程序調(diào)起簽約api
應(yīng)用場(chǎng)景
商戶可以通過請(qǐng)求此接口喚起小程序委托代扣的簽約頁(yè)面,頁(yè)面樣例見案例與規(guī)范。
用戶在微信的頁(yè)面中完成代扣簽約后,微信會(huì)同時(shí)將簽約信息通過異步通知的方式通知給商戶后臺(tái)。如果用戶放棄簽約或簽約失敗則不通知。
商戶流程介紹
- 1.用戶從商戶小程序發(fā)起簽約請(qǐng)求 (商戶需確認(rèn)委托代扣權(quán)限已開通,模板已審批通過,小程序APPID與商戶號(hào)已綁定)
- 2.商戶將簽約請(qǐng)求參數(shù)按照規(guī)則拼接之后,通過小程序跳轉(zhuǎn),向簽約小程序發(fā)起簽約請(qǐng)求
- 3.用戶在微信簽約小程序選擇支付方式完成簽約
- 4.微信將簽約結(jié)果返回給商戶
接口調(diào)用請(qǐng)求說(shuō)明
接口 | wx.navigateToMiniProgram(OBJECT)接口 |
---|---|
說(shuō)明 | iOS 微信客戶端 6.5.9 版本開始支持,Android 客戶端即將在 6.5.10 版本開始支持 |
OBJECT參數(shù)說(shuō)明:
字段含義 | 變量名 | 必填 | 示例值 | 類型 | 描述 |
---|---|---|---|---|---|
微信簽約小程序appid |
appId |
是 |
wxbd687630cd02ce1d |
String |
固定值 |
-場(chǎng)景信息傳遞給小程序的數(shù)據(jù) | extraData |
是 |
{"appid":"wx0317c726bd1c1111","mch_id":"1900000000","sub_mch_id":"1900000001","notify_url":"https://www.qq.com/a.php","contract_code":"2017121216136aa","contract_display_account":"張三","plan_id":"72803","request_serial":"1000","timestamp":"1513065696","sign":"63EE946A87EE1C8F6C12C1DB085C8B7E"} |
object |
簽約的請(qǐng)求參數(shù),詳情見extraData字段詳細(xì)說(shuō)明 |
--商戶號(hào) |
mch_id |
是 |
10000098 |
String(32) |
微信支付分配的商戶號(hào) |
--子商戶號(hào) |
sub_mch_id |
是 |
10000097 |
String(32) |
微信支付分配的子商戶號(hào) |
--公眾賬號(hào)id |
appid |
是 |
wxcbda96de0b165486 |
String(32) |
服務(wù)商商戶號(hào)綁定的appid |
--子公眾賬號(hào)id |
sub_appid |
否 |
wxcbda96de0b165484 |
String(32) |
子商戶號(hào)綁定的appid |
--模板id |
plan_id |
是 |
123 |
String(28) |
協(xié)議模板id |
--簽約協(xié)議號(hào) |
contract_code |
是 |
100001256 |
String(128) |
商戶側(cè)的簽約協(xié)議號(hào),由商戶生成,商戶側(cè)須唯一 |
--請(qǐng)求序列號(hào) |
request_serial |
是 |
1695 |
int(64) |
商戶請(qǐng)求簽約時(shí)的序列號(hào)。序列號(hào)主要用于排序,不作為查詢條件,純數(shù)字。長(zhǎng)度不超過12位 |
--用戶賬戶展示名稱 |
contract_display_account |
是 |
張三 |
String(128) |
簽約用戶的名稱,用于頁(yè)面展示,不需要對(duì)值進(jìn)行urlencode,參數(shù)值不支持UTF8非3字節(jié)編碼的字符,例如表情符號(hào),所以請(qǐng)勿傳微信昵稱到該字段 |
--回調(diào)通知url |
notify_url |
是 |
http://yoursite.com |
String(32) |
HTTP或者HTTPS開頭的回調(diào)通知url ,不需要對(duì)值進(jìn)行urlencode |
--簽名 |
sign |
是 |
E1EE61A91C8E90F299DE6AE075D60A2D |
String(32) |
注:是對(duì)extraData內(nèi)所有參數(shù)按照簽名生成算法做簽名,所有參數(shù)都是encode前的值參與簽名 |
--時(shí)間戳 |
timestamp |
是 |
1414488825 |
String(10) |
系統(tǒng)當(dāng)前時(shí)間,定義規(guī)則詳見時(shí)間戳 |
--商戶側(cè)用戶標(biāo)識(shí) |
outerid |
否 |
|
String |
用戶在商戶側(cè)的標(biāo)識(shí) |
打開小程序的頁(yè)面路徑 |
path |
是 |
pages/index/index |
string |
固定值:pages/index/index |
接口調(diào)用成功的回調(diào)函數(shù) |
success |
是 |
|
Function |
|
接口調(diào)用失敗的回調(diào)函數(shù) |
fail |
是 |
|
Function |
|
接口調(diào)用結(jié)束的回調(diào)函數(shù) |
complete |
是 |
|
Function |
調(diào)用成功、失敗都會(huì)執(zhí)行 |
示例:
wx.navigateToMiniProgram({ appId:'wxbd687630cd02ce1d', path:'pages/index/index', extraData:{ appid:'wx426a3015555a46be', contract_code:'122', contract_display_account:'張三', mch_id:'1223816102', sub_mch_id:'1223816104', notify_url:'https://www.qq.com/test/papay', plan_id:'106', request_serial:'123', timestamp:1414488825, sign:'FF1A406564EE701064450CA2149E2514' }, success(res) { // 成功跳轉(zhuǎn)到簽約小程序 }, fail(res) { // 未成功跳轉(zhuǎn)到簽約小程序 } }) |
用戶簽約完成之后,會(huì)跳轉(zhuǎn)回商戶小程序,可通過onShow(OBJECT)所攜帶的參數(shù)判斷判斷用戶由簽約小程序返回商戶小程序,OBJECT返回參數(shù)請(qǐng)查看小程序開發(fā)文檔onShow參數(shù)說(shuō)明
referrerInfo.extraData字段說(shuō)明
返回碼 | 變量名 | 必填 | 示例值 | 類型 | 描述 |
---|---|---|---|---|---|
返回碼 |
return_code |
是 |
SUCCESS |
String |
客戶端小程序收到的簽約結(jié)果 SUCCESS:簽約成功 FAIL:簽約失敗 |
錯(cuò)誤信息 |
return_msg |
是 |
|
String |
簽約失敗的錯(cuò)誤信息 |
委托代扣協(xié)議id |
contract_id |
是 |
201710180325670965 |
String |
簽約成功后微信返回的委托代扣協(xié)議id |
注意:如果用戶正常點(diǎn)擊微信簽約頁(yè)的確定按鈕返回商戶小程序,那么會(huì)返回extraData ; 如果用戶點(diǎn)擊瀏覽器左上角的返回,則不返回extraData
示例:
App({
onShow(res) { if (res.scene === 1038) { // 場(chǎng)景值1038:從被打開的小程序返回 const { appId, extraData } = res.referrerInfo if (appId == 'wxbd687630cd02ce1d') { // appId為wxbd687630cd02ce1d:從簽約小程序跳轉(zhuǎn)回來(lái) if (typeof extraData == 'undefined'){ // TODO // 客戶端小程序不確定簽約結(jié)果,需要向商戶側(cè)后臺(tái)請(qǐng)求確定簽約結(jié)果 return; } if(extraData.return_code == 'SUCCESS'){ // TODO // 客戶端小程序簽約成功,需要向商戶側(cè)后臺(tái)請(qǐng)求確認(rèn)簽約結(jié)果 var contract_id = extraData.contract_id return; } else { // TODO // 簽約失敗 return; } } } } }) |
返回參數(shù)(異步返回)
簽約成功后,微信會(huì)把相關(guān)簽約結(jié)果異步發(fā)送給商戶,返回的url為調(diào)用上述簽約接口時(shí)填寫的notify_url字段。商戶在收到簽約結(jié)果通知后,需進(jìn)行接收處理并返回應(yīng)答
對(duì)后臺(tái)通知交互時(shí),如果微信收到商戶的應(yīng)答不是成功或超時(shí),微信認(rèn)為通知失敗,微信會(huì)通過一定的策略定期重新發(fā)起通知,盡可能提高通知的成功率,但微信不保證通知最終能成功。
(通知頻率為15/15/30/180/1800/1800/1800/1800/3600,單位:秒)
由于存在重新發(fā)送后臺(tái)通知的情況,因此同樣的通知可能會(huì)多次發(fā)送給商戶系統(tǒng)。商戶系統(tǒng)必須能夠正確處理重復(fù)的通知。
推薦的做法是,當(dāng)收到通知進(jìn)行處理時(shí),首先檢查對(duì)應(yīng)業(yè)務(wù)數(shù)據(jù)的狀態(tài),判斷該通知是否已經(jīng)處理過,如果沒有處理過再進(jìn)行處理,如果處理過直接返回結(jié)果成功。在對(duì)業(yè)務(wù)數(shù)據(jù)進(jìn)行狀態(tài)檢查和處理之前,要采用數(shù)據(jù)鎖進(jìn)行并發(fā)控制,以避免函數(shù)重入造成的數(shù)據(jù)混亂。
字段名 | 變量名 | 必填 | 示例值 | 類型 | 說(shuō)明 |
---|---|---|---|---|---|
返回狀態(tài)碼 |
return_code |
是 |
SUCCESS |
String(16) |
SUCCESS/FAIL |
返回信息 |
return_msg |
否 |
簽名失敗 |
String(128) |
返回信息,如非空,為錯(cuò)誤原因 |
以下字段在return_code為SUCCESS的時(shí)候返回 | |||||
業(yè)務(wù)結(jié)果 |
result_code |
是 |
SUCCESS |
String(16) |
SUCCESS/FAIL |
以下字段在return_code 和result_code都為SUCCESS的時(shí)候有返回 | |||||
商戶號(hào) |
mch_id |
是 |
10000098 |
String(32) |
微信支付分配的商戶號(hào) |
子商戶號(hào) | sub_mch_id | 是 |
1900000109 | String(32) | 微信支付分配的子商戶號(hào) |
簽約協(xié)議號(hào) |
contract_code |
是 |
100001256 |
String(128) |
簽約協(xié)議號(hào) |
模板id |
plan_id |
是 |
123 |
String |
協(xié)議模板id |
用戶標(biāo)識(shí) |
openid |
是 |
onqOjjmM1tad-3ROpncN-yUfa6ua |
String(32) |
Appid下,用戶的唯一標(biāo)識(shí) |
用戶子標(biāo)識(shí) | sub_openid | 否 |
oUpF8uMuAJO_M2pxb1Q9zNjWeS6o | String(32) | sub_appid下,用戶的唯一標(biāo)識(shí) |
簽名 |
sign |
是 |
C380BEC2BFD727A4B6845133519F3AD6 |
String(32) |
詳見簽名生成算法 |
變更類型 |
change_type |
是 |
ADD |
String(32) |
有兩個(gè)變更類型取值: |
操作時(shí)間 |
operate_time |
是 |
2015-07-01 10:00:00 |
String |
操作時(shí)間 |
委托代扣協(xié)議id |
contract_id |
是 |
Wx15463511252015071056489715 |
String(32) |
簽約成功后,微信返回的委托代扣協(xié)議id |
協(xié)議到期時(shí)間 |
contract_expired_time |
是 |
2016-07-01 10:00:00 |
String |
協(xié)議到期時(shí)間 |
請(qǐng)求序列號(hào) |
request_serial |
是 |
1695 |
String |
商戶請(qǐng)求簽約時(shí)的序列號(hào),商戶側(cè)須唯一,純數(shù)字。長(zhǎng)度不超過12位 |
示例:
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<result_code><![CDATA[SUCCESS]]></result_code>
<sign><![CDATA[C380BEC2BFD727A4B6845133519F3AD6]]></sign>
<mch_id>10010404</mch_id>
<sub_mch_id>10010405</sub_mch_id>
<contract_code>100001256</contract_code>
<openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6ua]]></openid>
<plan_id><![CDATA[123]]></plan_id>
<change_type><![CDATA[ADD]]></change_type>
<operate_time><![CDATA[2015-07-01 10:00:00]]></operate_time>
<contract_id><![CDATA[Wx15463511252015071056489715]]></contract_id>
</xml>
商戶需返回參數(shù)
由于微信會(huì)多次通知商戶服務(wù)器關(guān)于用戶簽約的結(jié)果和相關(guān)信息,為了避免給商戶服務(wù)器造成過大的壓力,請(qǐng)?jiān)诘玫轿⑿藕灱s結(jié)果通知之后,返回以下內(nèi)容。(請(qǐng)求方式:post)
字段名 | 變量名 | 必填 | 示例值 | 類型 | 說(shuō)明 |
---|---|---|---|---|---|
返回狀態(tài)碼 |
return_code |
是 |
SUCCESS |
String(16) |
SUCCESS/FAIL |
返回信息 |
return_msg |
否 |
OK |
String(32) |
返回信息,如非空,為錯(cuò)誤原因 |
商戶返回示例:
? <return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>
如果商戶側(cè)配置了防火墻,需要對(duì)商戶回調(diào)通知功能開通下面白名單網(wǎng)段:
101.226.233.128/25