小程序下单
<p><strong>使用场景:</strong> </p>
<ul>
<li>用户在业务系统下单,业务系统获取了订单信息后,根据业务系统的具体应用环境(小程序、APP或H5),使用本接口下方对应的调用方法将相关参数传入并拉起通企付小程序,通企付小程序负责渠道下单支付,并返回交易结果。</li>
</ul>
<p><strong>请求参数:</strong> </p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名</th>
<th style="text-align: left;">必选</th>
<th style="text-align: left;">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">orgId</td>
<td style="text-align: left;">否</td>
<td style="text-align: left;">string</td>
<td>服务商id,用于服务商代发起交易,传了此参数需要用服务商秘钥进行加签</td>
</tr>
<tr>
<td style="text-align: left;">mchNo</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>通企付商户号,示例:E249974037860</td>
</tr>
<tr>
<td style="text-align: left;">appId</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>默认为商户应用ID,若为服务商模式,需传入服务商appId</td>
</tr>
<tr>
<td style="text-align: left;">reqTime</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>请求时间,13位时间戳</td>
</tr>
<tr>
<td style="text-align: left;">version</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>版本(默认为1.0)</td>
</tr>
<tr>
<td style="text-align: left;">sign</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>签名</td>
</tr>
<tr>
<td style="text-align: left;">signType</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>签名类型(MD5/RSA/SM2)</td>
</tr>
<tr>
<td style="text-align: left;">mchOrderNo</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>商户订单号</td>
</tr>
<tr>
<td style="text-align: left;">amount</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>金额(单位:分)</td>
</tr>
<tr>
<td style="text-align: left;">body</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>商品描述</td>
</tr>
<tr>
<td style="text-align: left;">goodsInfo</td>
<td style="text-align: left;">否</td>
<td style="text-align: left;">string</td>
<td>商品备注,为List<goodsInfo>的JSON字符串,使用B2B订单支付时必填</td>
</tr>
<tr>
<td style="text-align: left;">notifyUrl</td>
<td style="text-align: left;">否</td>
<td style="text-align: left;">string</td>
<td>通知地址</td>
</tr>
<tr>
<td style="text-align: left;">expiredTime</td>
<td style="text-align: left;">否</td>
<td style="text-align: left;">int</td>
<td>订单失效时间,单位秒,默认1小时.订单在(创建时 间+失效时间)后失效</td>
</tr>
<tr>
<td style="text-align: left;">extParam</td>
<td style="text-align: left;">否</td>
<td style="text-align: left;">string</td>
<td>商户扩展参数</td>
</tr>
<tr>
<td style="text-align: left;">channelExtra</td>
<td style="text-align: left;">否</td>
<td style="text-align: left;">string</td>
<td>渠道参数,JSON字符串,特定渠道发起的额外参数,如:收银宝子商户号cusid,集团商户号orgid,微信appid即subAppid。例如:channelExtra={"orgid":"66045xxxxxxx","cusid":"66046xxxxxxxxx"}</td>
</tr>
<tr>
<td style="text-align: left;">payTypeInfo</td>
<td style="text-align: left;">否</td>
<td style="text-align: left;">string</td>
<td>收银台展示的付款方式,以逗号(,)隔开;<strong>注释</strong>:<br>WX_PAY(微信),<br>ALI_PAY(支付宝),<br>C_PAY(个人银行卡),<br>B_PAY(企业网银),<br>LOAN_PAY(信用支付),<br>ZZHK_PAY(转账汇款);</td>
</tr>
<tr>
<td style="text-align: left;">directPayType</td>
<td style="text-align: left;">否</td>
<td style="text-align: left;">string</td>
<td>直接支付的支付方式,填入该参数则自动使用该支付方式下单并拉起支付,当前支持:<br>WX_LITE:微信小程序支付;<br>SFT_HRJ:通联汇入金;<br>ALI_QR:支付宝支付(访问通企付微信小程序收银台可用);<br>ALI_JSAPI:支付宝JS支付(访问通企付支付宝小程序收银台可用);<br>ALI_CREDIT:花呗分期<!--;<br>SYB_B2C_WECHAT:微信小程序收银台支付)--></td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th style="text-align: left;">goodsInfo参数名</th>
<th style="text-align: left;">必选</th>
<th style="text-align: left;">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">goodsnm</td>
<td style="text-align: left;">是</td>
<td style="text-align: left;">string</td>
<td>商品简称</td>
</tr>
<tr>
<td style="text-align: left;">goodsamt</td>
<td style="text-align: left;">否</td>
<td style="text-align: left;">string</td>
<td>商品金额(单位:元)</td>
</tr>
<tr>
<td style="text-align: left;">goodsnum</td>
<td style="text-align: left;">否</td>
<td style="text-align: left;">string</td>
<td>商品数量</td>
</tr>
</tbody>
</table>
<p><strong>响应参数</strong> </p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名</th>
<th style="text-align: left;">类型</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">code</td>
<td style="text-align: left;">string</td>
<td>success:支付成功;pending:支付中 cancel:取消支付;fail:支付失败</td>
</tr>
<tr>
<td style="text-align: left;">msg</td>
<td style="text-align: left;">string</td>
<td>响应内容(当code为cancel、fail有值)</td>
</tr>
<tr>
<td style="text-align: left;">mchOrderNo</td>
<td style="text-align: left;">string</td>
<td>商户订单号</td>
</tr>
<tr>
<td style="text-align: left;">amount</td>
<td style="text-align: left;">string</td>
<td>金额</td>
</tr>
<tr>
<td style="text-align: left;">mchNo</td>
<td style="text-align: left;">string</td>
<td>商户号</td>
</tr>
<tr>
<td style="text-align: left;">mchName</td>
<td style="text-align: left;">string</td>
<td>商户名称</td>
</tr>
</tbody>
</table>
<p>调用示例,示例仅展示部分字段,具体字段自行根据业务需求填写</p>
<h1>通企付微信小程序收银台跳转</h1>
<p>小程序收银台原始 ID:gh_4fa331e708fb
小程序收银台 appId:wxe48aedff31caaf2d</p>
<p><strong>客户小程序调起通企付小程序收银台</strong></p>
<pre><code> wx.openEmbeddedMiniProgram({
appId: &quot;wxe48aedff31caaf2d&quot;,
path:&quot;pages/index/index&quot;,
extraData:{
拼写请求参数
},
success: function (res) {
console.log(&quot;成功回调返回的res:&quot; + JSON.stringify(res))
},
fail: function (res) {
console.log(&quot;失败回调返回的res:&quot; + JSON.stringify(res))
},
complete: function () {
console.log(&quot;完成调用&quot;)
}
})</code></pre>
<p>通过上述方法会调起收银台半屏小程序,在收银台中完成支付后,会回调支付结果,具体结果可以在小程序生命周期Page.onShow中通过以下方式获取:</p>
<pre><code>onShow: function () {
let options = wx.getEnterOptionsSync();
if (options.scene == &#039;1038&#039; &amp;&amp;
options.referrerInfo.appId==&#039;wxe48aedff31caaf2d&#039;) {
// 代表从收银台小程序返回
let extraData = options.referrerInfo.extraData;
if (!extraData) {
// &quot;当前通过物理按键返回,未接收到返参,建议自行查询交易结果&quot;;
} else {
if (extraData.code == &#039;success&#039;) {
// &quot;支付成功&quot;;
} else if (extraData.code == &#039;cancel&#039;) {
// &quot;支付已取消&quot;;
} else {
// &quot;支付失败:&quot; + extraData.errmsg;
}
}
}
},</code></pre>
<p><strong>客户APP调起通企付小程序收银台</strong></p>
<p>Android开发示例:</p>
<p><a href="https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Launching_a_Mini_Program/Android_Development_example.html">https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Launching_a_Mini_Program/Android_Development_example.html</a></p>
<p>iOS开发示例:</p>
<p><a href="https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Launching_a_Mini_Program/iOS_Development_example.html">https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Launching_a_Mini_Program/iOS_Development_example.html</a></p>
<p>调起方式如上文档,这里展示部分字段,具体字段自行根据业务需求填写</p>
<p>path=pages/index/index?mchNo=平台分配的商户号&appId=平台分配的应用ID&reqTime=请求时间&version=1.0&sign=签名&signType=MD5&mchOrderNo=商户唯一订单号&amount=金额&expiredTime=失效时间&body=描述</p>
<p><strong>客户微信环境H5调起通企付小程序收银台</strong></p>
<p>微信环境前端h5拉起小程序的能力可以参考微信官方文档:
<a href="https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_Open_Tag.html">https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_Open_Tag.html</a>
JS-SDK引入的初始化步骤详见上诉文档,具体下单业务字段根据业务需求填写在path后面</p>
<pre><code>&lt;wx-open-launch-weapp
appId: &quot;wxe48aedff31caaf2d&quot;
path=&quot;pages/index/index?key1=value1&amp;key2=value2&amp;key3=value3&quot;
&gt;
&lt;script type=&quot;text/wxtag-template&quot;&gt;
&lt;style&gt;.btn { padding: 12px }&lt;/style&gt;
&lt;button class=&quot;btn&quot;&gt;打开小程序&lt;/button&gt;
&lt;/script&gt;
&lt;/wx-open-launch-weapp&gt;</code></pre>
<h1>通企付支付宝小程序收银台跳转</h1>
<p>小程序收银台appid: 2021004162658199</p>
<p><strong>客户小程序调起通企付小程序收银台</strong></p>
<pre><code class="language-html"> my.navigateToMiniProgram({
appId: &#039;2021004162658199&#039;,
path: &#039;pages/index/index&#039;,
extraData: {
mchNo: &quot;平台分配的商户号&quot;,
appId: &quot;平台分配的应用ID&quot;,
reqTime: &quot;请求时间&quot;,
version: &quot;1.0&quot;,
sign: &quot;签名&quot;,
signType:&quot;MD5&quot;,
mchOrderNo: &quot;商户唯一订单号&quot;,
notify_url: &quot;服务器异步通知页面路径&quot;,
expiredTime: &quot;失效时间&quot;,
body: &quot;描述&quot;,
}
})</code></pre>
<p>通过上述方法会调起收银台小程序,在收银台中完成支付后,会回调支付结果,具体结果可以在小程序生命周期Page.onShow中通过以下方式获取:</p>
<pre><code class="language-html">onShow: function () {
let options = my.getEnterOptionsSync();
if (options.scene == &#039;1038&#039; &amp;&amp;
options.referrerInfo.appId==&#039;2021004162658199&#039;) {
// 代表从收银台小程序返回
let extraData = options.referrerInfo.extraData;
if (extraData.code == &#039;success&#039;) {
// &quot;支付成功&quot;;
} else if (extraData.code == &#039;cancel&#039;) {
// &quot;支付已取消&quot;;
} else {
// &quot;支付失败:&quot; + extraData.errmsg;
}
}
}</code></pre>
<p>特殊说明:
一般情况下my.getEnterOptionsSync()中获取的extraData为收银台小程序返回的支付结果,但是当通过物理返回键返回(即未通过收银台小程序内按钮返回),extraData内容会为空,调用方小程序会无法获得支付结果,该情况为支付宝小程序特性,小程序代码无法处理。
如遇到该情况,需要自行添加标记位判断是否跳到收银台返回,再自行查询订单支付结果</p>
<p><strong>客户APP调起通企付小程序收银台</strong>
先将下单参数转换成json字符串,json转换方式可自行选择
将下单参数json组装成query参数格式,并进行urlencode后拼接进跳转schemeurl
示例代码如下,此处仅展示部分字段:</p>
<pre><code>String json = &quot;{
\&quot;mchNo\&quot;: \&quot;平台分配的商户号\&quot;,
\&quot;appId\&quot;: \&quot;平台分配的应用ID\&quot;,
\&quot;reqTime\&quot;: \&quot;请求时间\&quot;,
\&quot;version\&quot;: \&quot;1.0\&quot;,
\&quot;sign\&quot;: \&quot;签名\&quot;,
\&quot;signType\&quot;: \&quot;MD5\&quot;,
\&quot;mchOrderNo\&quot;: \&quot;商户唯一订单号\&quot;,
\&quot;notify_url\&quot;: \&quot;服务器异步通知页面路径\&quot;,
\&quot;expiredTime\&quot;: \&quot;失效时间\&quot;,
\&quot;body\&quot;: \&quot;描述\&quot;
}&quot;;
String query = URLEncoder.encode(&quot;payinfo=&quot; + URLEncoder.encode(json, &quot;UTF-8&quot;), &quot;UTF-8&quot;);
String url =
&quot;alipays://platformapi/startapp?appId=2021004162658199&amp;page=pages/index/index&amp;thirdPartSchema=&quot;
+ URLEncoder.encode(&quot;APP接收跳转的schemeurl&quot;, &quot;UTF-8&quot;)
+ &quot;&amp;query=&quot; + query;</code></pre>
<p>其中thirdPartSchema是app接收跳转的scheme,该字段需要urlencode,其中下单参数按照上述方式组装,共需要两次urlencode</p>
<p>特殊说明:</p>
<p>小程序回调APP结果说明:
小程序回调是支付宝通过thirdPartSchema带参跳转APP,APP再通过协议获取具体字段参数,其中支付宝进行跳转时是直接在thirdPartSchema后拼接backfromalipay? errmsg=结果信息&code=结果码,如thirdPartSchema为 “allinpaysdk://sdk/”,则app接收的schemeurl为“allinpaysdk://sdk/backfromalipay?errmsg=结果信息&code=结果码”。
故建议:
1、 thirdPartSchema定义中不要自带参数,如要自带参数,则需要自行通过支付宝返回的schemeurl分割处理获取所需字段,以免报错或者获取不到字段;
2、 thirdPartSchema字段值以“/”结尾,如“allinpaysdk://sdk/”,而不是“allinpaysdk://sdk”
3、 thirdPartSchema字段如果未指定路径,则需要带上“://”,如“allinpaysdk://”</p>
<p>小程序回调app是通过schemeurl跳回app的,会带上code、errmsg参数,但是该回调仅限于在小程序内点击按钮返回APP时有效,但是当通过物理返回键返回APP、任务列表切换回APP即未通过收银台小程序内按钮退出,该回调并不会触发,该情况为支付宝小程序特性,小程序代码无法处理。</p>
<p>如遇到该情况,建议在APP跳转小程序时新建变量保存跳转标识,在APP内监听到重新打开APP且标志存在,则需要自行查询订单支付结果</p>
<p><strong>客户H5调起通企付小程序收银台</strong>
第一步:先将下单参数转换成json字符串,json转换方式可自行选择
第二步:对json字符串中的sign值进行encode 注:RSA及SM2加签模式下需要进行此步,MD5可以省略此步骤
第三步:将下单参数json整体加在payinfo=的后面进行urlencode:alipays://platformapi/startApp?appId=2021004162658199&page=pages/index/index&query=payinfo=+json字符串
第四步:把第三步urlencode的参数加在https://ds.alipay.com/?scheme=的后面组成打开支付宝的支付链接
拼装完成的示例:<a href="https://ds.alipay.com/?scheme=alipays%3A%2F%2Fplatformapi%2FstartApp%3FappId%3D2021004162658199%26page%3Dpages%2Findex%2Findex%26query%3Dpayinfo%3D%7B%22amount%22%3A%221%22%2C%22mchOrderNo%22%3A%222672f8361b1f4caa8a5f9f756edc8aa7%22%2C%22appId%22%3A%2266e13fb04bb6abfc8dfaf14b%22%2C%22sign%22%3A%22F492FEB46D2245E218D17F1F06029D57%22%2C%22signType%22%3A%22MD5%22%2C%22reqTime%22%3A%221730448570058%22%2C%22directPayType%22%3A%22ALI_JSAPI%22%2C%22body%22%3A%22%E6%8F%8F%E8%BF%B0%22%2C%22mchNo%22%3A%22E243596727039%22%2C%22version%22%3A%221.0%22%7D">https://ds.alipay.com/?scheme=alipays%3A%2F%2Fplatformapi%2FstartApp%3FappId%3D2021004162658199%26page%3Dpages%2Findex%2Findex%26query%3Dpayinfo%3D%7B%22amount%22%3A%221%22%2C%22mchOrderNo%22%3A%222672f8361b1f4caa8a5f9f756edc8aa7%22%2C%22appId%22%3A%2266e13fb04bb6abfc8dfaf14b%22%2C%22sign%22%3A%22F492FEB46D2245E218D17F1F06029D57%22%2C%22signType%22%3A%22MD5%22%2C%22reqTime%22%3A%221730448570058%22%2C%22directPayType%22%3A%22ALI_JSAPI%22%2C%22body%22%3A%22%E6%8F%8F%E8%BF%B0%22%2C%22mchNo%22%3A%22E243596727039%22%2C%22version%22%3A%221.0%22%7D</a></p>
<pre><code>String json = &quot;{
\&quot;mchNo\&quot;: \&quot;平台分配的商户号\&quot;,
\&quot;appId\&quot;: \&quot;平台分配的应用ID\&quot;,
\&quot;reqTime\&quot;: \&quot;请求时间\&quot;,
\&quot;version\&quot;: \&quot;1.0\&quot;,
\&quot;sign\&quot;: \&quot;签名\&quot;,
\&quot;signType\&quot;: \&quot;MD5\&quot;,
\&quot;mchOrderNo\&quot;: \&quot;商户唯一订单号\&quot;,
\&quot;notify_url\&quot;: \&quot;服务器异步通知页面路径\&quot;,
\&quot;expiredTime\&quot;: \&quot;失效时间\&quot;,
\&quot;body\&quot;: \&quot;描述\&quot;
}&quot;;
String query = URLEncoder.encode(&quot;alipays://platformapi/startApp?appId=2021004162658199&amp;page=pages/index/index&amp;query=payinfo=&quot; + json.toString);
String url =&quot;https://ds.alipay.com/?scheme=&quot; + query;</code></pre>