小程序支付
<h2>微信小程序支付接口</h2>
<p>> /api/pay/wechat</p>
<h3>主体请求参数</h3>
<table>
<thead>
<tr>
<th>参数名称</th>
<th>类型</th>
<th>必填</th>
<th>中文名</th>
</tr>
</thead>
<tbody>
<tr>
<td>sign</td>
<td>String</td>
<td>✅</td>
<td>签名</td>
</tr>
<tr>
<td>timestamp</td>
<td>String</td>
<td>✅</td>
<td>签名时间戳(毫秒)</td>
</tr>
<tr>
<td>merchantNo</td>
<td>String</td>
<td>✅</td>
<td>商户编号</td>
</tr>
<tr>
<td>merchantOrderNo</td>
<td>String</td>
<td>✅</td>
<td>商户订单号</td>
</tr>
<tr>
<td>payChannelId</td>
<td>int</td>
<td>✅</td>
<td>支付方式 固定传:3</td>
</tr>
<tr>
<td>channelCode</td>
<td>String</td>
<td>✅</td>
<td>渠道</td>
</tr>
<tr>
<td>amount</td>
<td>int</td>
<td>✅</td>
<td>支付金额(分)</td>
</tr>
<tr>
<td>wechatInfo</td>
<td>String</td>
<td>✅</td>
<td>微信信息(JSON字符串)</td>
</tr>
<tr>
<td>goodsDetail</td>
<td>String</td>
<td>✅</td>
<td>商品详情(JSON字符串)</td>
</tr>
<tr>
<td>supportFapiao</td>
<td>String</td>
<td>❌</td>
<td>电子发票入口开放标识 <br/>true:是<br/>false:否</td>
</tr>
<tr>
<td>notifyUrl</td>
<td>String</td>
<td>❌</td>
<td>回调地址</td>
</tr>
<tr>
<td>attach</td>
<td>String</td>
<td>❌</td>
<td>附加数据,支付成功原样返回</td>
</tr>
<tr>
<td>description</td>
<td>String</td>
<td>❌</td>
<td>订单商品描述</td>
</tr>
<tr>
<td>clientIp</td>
<td>String</td>
<td>❌</td>
<td>用户IP地址</td>
</tr>
<tr>
<td>goodsTag</td>
<td>String</td>
<td>❌</td>
<td>订单优惠标记,代金券或立减 优惠功能<br/>该参数传给微信,当前仅对微信交易生效</td>
</tr>
<tr>
<td>sceneInfo</td>
<td>String</td>
<td>❌</td>
<td>场景信息(JSON字符串)</td>
</tr>
<tr>
<td>terminalInfo</td>
<td>String</td>
<td>❌</td>
<td>交易终端信息(JSON字符串)</td>
</tr>
<tr>
<td>gpsInfo</td>
<td>String</td>
<td>❌</td>
<td>gps信息。<br/>校验GPS信息格式, 如:-128.12,23.1 <br/>1. xxx,xxx <br/>2. 经度xxx为[-180,180]之间的浮点数,维度xxx为[-90,90]之间的浮点数,最多保留小数点八位float(11,8)</td>
</tr>
<tr>
<td>bsInfo</td>
<td>String</td>
<td>❌</td>
<td>基站信息。<br/>校验基站信息格式,格式说明:<br/>-- 1. 格式为:xxx,xxx,xxx,xxx 如:460,1,12,23454<br/>-- 2. xxx均为整数,长度不超过11位 基站信息,从左至右依次对应以下几个字段: <br/>mcc: 移动国家号码,由3位数字组成,唯一地识别移动用户所属的国家。我国为460 <br/>mnc:移动网号,由两位数字组成,用于识别移动用户所归属的移动网 <br/>lac:位置区编码,为寻呼而设置的一个区域,覆盖一片地理区域,按寻呼量划分 <br/>ci :负责收发的天线所朝向的扇区编号</td>
</tr>
</tbody>
</table>
<h3>子节点请求参数</h3>
<h4>wechatInfo 微信信息JSON</h4>
<table>
<thead>
<tr>
<th>参数名称</th>
<th>类型</th>
<th>必选</th>
<th>中文名</th>
</tr>
</thead>
<tbody>
<tr>
<td>appid</td>
<td>String</td>
<td>✅</td>
<td>微信公众号APPID</td>
</tr>
<tr>
<td>openId</td>
<td>String</td>
<td>✅</td>
<td>微信用户openId</td>
</tr>
</tbody>
</table>
<h4>goodsDetail 商品详情JSON</h4>
<table>
<thead>
<tr>
<th>参数名称</th>
<th>类型</th>
<th>必选</th>
<th>中文名</th>
</tr>
</thead>
<tbody>
<tr>
<td>costPrice</td>
<td>String</td>
<td>❌</td>
<td>订单原价。 <br/>1.商户侧一张小票订单可能被分多次支付,订 单原价用于记录整张小票的交易金额。 <br/>2.当订单原价与支付金额不相等,则不享受优惠。 <br/>3.该字段主要用于防止同一张小票分多次支 付,以享受多次优惠的情况,正常支付订单不 必上传此参数。</td>
</tr>
<tr>
<td>receiptId</td>
<td>String</td>
<td>❌</td>
<td>商品小票 ID</td>
</tr>
<tr>
<td>details</td>
<td>json</td>
<td>✅</td>
<td>商品ID</td>
</tr>
<tr>
<td>» goodsId</td>
<td>String</td>
<td>✅</td>
<td>商品ID</td>
</tr>
<tr>
<td>» wxGoodsId</td>
<td>String</td>
<td>❌</td>
<td>微信侧商品编码 <br/>微信支付定义的统一商品编号(没有可不传)</td>
</tr>
<tr>
<td>» goodsName</td>
<td>String</td>
<td>✅</td>
<td>商品参数名称</td>
</tr>
<tr>
<td>» quantity</td>
<td>int</td>
<td>✅</td>
<td>商品数量</td>
</tr>
<tr>
<td>» price</td>
<td>int</td>
<td>✅</td>
<td>商品价格(分) <br/>如果商户有优惠,需传输商户优惠后的单价<br/>(例如:用户对一笔 100 元的订单使用了商场发的优惠券 100-50,则活动商品的单价应为原单价-50)</td>
</tr>
</tbody>
</table>
<h4>sceneInfo 场景信息JSON</h4>
<table>
<thead>
<tr>
<th>参数名称</th>
<th>类型</th>
<th>必选</th>
<th>中文名</th>
</tr>
</thead>
<tbody>
<tr>
<td>id</td>
<td>String</td>
<td>❌</td>
<td>门店 id</td>
</tr>
<tr>
<td>name</td>
<td>String</td>
<td>❌</td>
<td>门店名称</td>
</tr>
<tr>
<td>areaCode</td>
<td>String</td>
<td>❌</td>
<td>门店所在地行政区划码</td>
</tr>
<tr>
<td>address</td>
<td>String</td>
<td>❌</td>
<td>门店详细地址</td>
</tr>
</tbody>
</table>
<h4>terminalInfo 交易终端信息JSON</h4>
<table>
<thead>
<tr>
<th>参数名称</th>
<th>类型</th>
<th>必选</th>
<th>中文名</th>
</tr>
</thead>
<tbody>
<tr>
<td>longitude</td>
<td>String</td>
<td>❌</td>
<td>受理终端设备实时经度信息。<br/>经度为[-180,180]之前的浮点数,最多保留小数点8位<br/>-表示西经,+表示东经(不带正号时也表示东经)</td>
</tr>
<tr>
<td>latitude</td>
<td>String</td>
<td>❌</td>
<td>受理终端设备实时纬度信息。<br/>纬度为[-90,90]之前的浮点数,最多保留小数点8位<br/>-表示南纬,+表示北纬(不带正号时也表示北纬)</td>
</tr>
<tr>
<td>networkLicense</td>
<td>String</td>
<td>❌</td>
<td>终端入网认证编号。<br/>银行卡受理终端产品应用认证编 号。该编号由“中国银联标识产品企业资质认证办公室”为通过入网认证的终端进行分配。银联直连终端必填。<br/> 格式:5 位字符,例如 P3100</td>
</tr>
<tr>
<td>deviceType</td>
<td>String</td>
<td>✅</td>
<td>终端设备类型,受理方可参考终端。注册时的设备类型填写,取值如下:<br/>01:自动柜员机(含 ATM 和 CDM)和多媒体自助终端<br/>02:传统 POS<br/>03:mPOS<br/>04:智能 POS<br/>05:II 型固定电话<br/>06:云闪付终端;<br/>07:保留使用;<br/>08:手机 POS;<br/>09:刷脸付终端;<br/>10:条码支付受理终端;<br/>11:条码支付辅助受理终端;<br/>12:行业终端(公交、地铁用于指定行业的终端)<br/>13:MIS 终端;</td>
</tr>
<tr>
<td>deviceId</td>
<td>String</td>
<td>✅</td>
<td>终端设备号,收单机构为商户终端分配的唯一编号</td>
</tr>
<tr>
<td>serialNum</td>
<td>String</td>
<td>⭕️</td>
<td>50 终端设备的硬件序列号,出现要求: 终端类型<br/>(device_type)填写为 02、03、04、05、06、08、09 或 10 时,必须填写终端序列号。</td>
</tr>
<tr>
<td>encryptRandNum</td>
<td>String</td>
<td>❌</td>
<td>加密随机因子。<br/>仅在被扫支付类交易报文中出现:若付款码为 19 位数字,则取后6 位;若付款码为 EMV 二维码,则取其 tag 57 的卡号/token 号的后 6 位</td>
</tr>
<tr>
<td>secretText</td>
<td>String</td>
<td>❌</td>
<td>16 密文数据。<br/>仅在被扫支付类交易报文中出现: 64bit 的密文数据,对终端硬件序列号和加密随机因子加密后的结果。 本子域取值为:64bit 密文数据进行base64 编码后的结果。</td>
</tr>
<tr>
<td>appVersion</td>
<td>String</td>
<td>❌</td>
<td>应用程序版本号。终端应用程序的版本号。应用程序变更应保证版本号不重复。当长度不足时,右补空格。</td>
</tr>
<tr>
<td>deviceIp</td>
<td>String</td>
<td>⭕️</td>
<td>商户端终端设备 IP 地址。<br/>注:如经、 维度信息未上送,该字段必送。</td>
</tr>
</tbody>
</table>
<p>> 请求参数示例(参数需要加密,以下是加密前的示例)</p>
<pre><code class="language-json">{
&quot;sign&quot;: &quot;291C70CA1DC3823C79ABA4DAD95C5D98&quot;,
&quot;timestamp&quot;: &quot;1735660800000&quot;,
&quot;merchantNo&quot;: 17170000000000000000,
&quot;merchantOrderNo&quot;: &quot;NO1234567890&quot;,
&quot;payChannelId&quot;: 3,
&quot;channelCode&quot;: &quot;LeShua&quot;,
&quot;amount&quot;: 1,
&quot;goodsDetail&quot;: &quot;{\&quot;costPrice\&quot;:1,\&quot;receiptId\&quot;:\&quot;NO123\&quot;,\&quot;details\&quot;:[{\&quot;goodsId\&quot;:\&quot;1\&quot;,\&quot;wxGoodsId\&quot;:\&quot;2\&quot;,\&quot;goodsName\&quot;:\&quot;测试商品\&quot;,\&quot;quantity\&quot;:1,\&quot;price\&quot;:1}]}&quot;,
&quot;wechatInfo&quot;: &quot;{\&quot;openId\&quot;:\&quot;openId\&quot;,\&quot;appid\&quot;:\&quot;appid\&quot;}&quot;,
&quot;notifyUrl&quot;: &quot;https://abc/abc&quot;,
&quot;clientIp&quot;: &quot;127.0.0.1&quot;,
&quot;attach&quot;: &quot;附加信息&quot;,
&quot;description&quot;: &quot;商品A&quot;,
&quot;supportFapiao&quot;: &quot;false&quot;,
&quot;goodsTag&quot;: &quot;WXG3&quot;,
&quot;gpsInfo&quot;: &quot;128.12,23.1&quot;,
&quot;bsInfo&quot;: &quot;460&quot;,
&quot;sceneInfo&quot;: &quot;{\&quot;id\&quot;:\&quot;123\&quot;,\&quot;name\&quot;:\&quot;门店\&quot;,\&quot;areaCode\&quot;:\&quot;101010\&quot;,\&quot;address\&quot;:\&quot;详细地址\&quot;}&quot;,
&quot;terminalInfo&quot;: &quot;{\&quot;longitude\&quot;:\&quot;177.22\&quot;,\&quot;latitude\&quot;:\&quot;-22.99\&quot;,\&quot;networkLicense\&quot;:\&quot;P3100\&quot;,\&quot;deviceType\&quot;:\&quot;02\&quot;,\&quot;deviceId\&quot;:\&quot;POS01\&quot;,\&quot;serialNum\&quot;:\&quot;123321\&quot;,\&quot;encryptRandNum\&quot;:\&quot;111111\&quot;,\&quot;secretText\&quot;:\&quot;2222222\&quot;,\&quot;appVersion\&quot;:\&quot;333\&quot;,\&quot;deviceIp\&quot;:\&quot;127.0.0.1\&quot;}&quot;
}</code></pre>
<h3>返回数据结构</h3>
<table>
<thead>
<tr>
<th>参数名称</th>
<th>类型</th>
<th>必填</th>
<th>是否加密</th>
<th>中文名</th>
</tr>
</thead>
<tbody>
<tr>
<td>success</td>
<td>boolean</td>
<td>是</td>
<td>❌</td>
<td>响应状态</td>
</tr>
<tr>
<td>code</td>
<td>integer</td>
<td>是</td>
<td>❌</td>
<td>响应编码</td>
</tr>
<tr>
<td>msg</td>
<td>string</td>
<td>是</td>
<td>❌</td>
<td>响应信息</td>
</tr>
<tr>
<td>data</td>
<td>object</td>
<td>是</td>
<td>❌</td>
<td>响应数据</td>
</tr>
<tr>
<td>» sign</td>
<td>string</td>
<td>是</td>
<td>❌</td>
<td>签名</td>
</tr>
<tr>
<td>» timestamp</td>
<td>string</td>
<td>是</td>
<td>❌</td>
<td>签名时间戳(毫秒)</td>
</tr>
<tr>
<td>» merchantNo</td>
<td>string</td>
<td>是</td>
<td>❌</td>
<td>商户编号</td>
</tr>
<tr>
<td>» orderNo</td>
<td>string</td>
<td>是</td>
<td>✅</td>
<td>聚合平台订单号</td>
</tr>
<tr>
<td>» merchantOrderNo</td>
<td>string</td>
<td>是</td>
<td>✅</td>
<td>商户订单号</td>
</tr>
<tr>
<td>» payInfo</td>
<td>string</td>
<td>是</td>
<td>✅</td>
<td>支付信息</td>
</tr>
<tr>
<td>» placeTime</td>
<td>string</td>
<td>是</td>
<td>✅</td>
<td>下单时间</td>
</tr>
<tr>
<td>» payState</td>
<td>string</td>
<td>是</td>
<td>✅</td>
<td>订单支付状态 <br/>0:未支付;<br/>1:已支付;<br/>2:支付失败;<br/>3:支付关闭;<br/>4:支付超时;<br/>5:退款中;<br/>6:已退款</td>
</tr>
<tr>
<td>» attach</td>
<td>string</td>
<td>是</td>
<td>✅</td>
<td>附加数据</td>
</tr>
<tr>
<td>» clientIp</td>
<td>string</td>
<td>是</td>
<td>✅</td>
<td>用户IP</td>
</tr>
</tbody>
</table>
<p>> 返回示例(data参数需要解密,以下是实际响应数据示例)</p>
<p>状态码 <strong>200</strong></p>
<pre><code class="language-json">{
&quot;success&quot;: true,
&quot;code&quot;: 200,
&quot;msg&quot;: &quot;操作成功&quot;,
&quot;data&quot;: {
&quot;sign&quot;: &quot;291C70CA1DC3823C79ABA4DAD95C5D98&quot;,
&quot;timestamp&quot;: 1743582863829,
&quot;merchantNo&quot;: &quot;17170000000000000000&quot;,
&quot;orderNo&quot;: &quot;t3q96ediYXvvWbi1eqHJ5YBthAoEyWqIzkOqAWiai/E=&quot;,
&quot;merchantOrderNo&quot;: &quot;WLXzddn2ATFBPSf9kI4edk9VltyAJ8/TTiSb7V1TT80=&quot;,
&quot;payInfo&quot;: &quot;hQtMf0FCe37**************************&quot;,
&quot;placeTime&quot;: &quot;XDzklufxmMBnd7G/uISZ3w==&quot;,
&quot;payState&quot;: &quot;hQtMf0FCe37ZPOHU4HL4xA==&quot;,
&quot;attach&quot;: &quot;Br/deow2oXKRDZ2B7fIE3w==&quot;,
&quot;clientIp&quot;: &quot;zi2j3OnP+gv5bTIh1k6QXA==&quot;
}
}</code></pre>