接口说明
<p><strong>注:</strong>以下请求中的<code>mchOrderNo</code>必须全局永远唯一(不区分商户、日期)。</p>
<p>>流水号规则:日期(yyyyMMdd,8位)+时间(HHmmss)+其他随机数(8-18位,只能包含字母、数字和下划线,区分大小写,保证不重复)。如果流水号重复,会直接拒绝交易!!!</p>
<ul>
<li>
<h2><a href="#术语及定义">术语及定义</a></h2>
<p><code>交易金额</code>: 金额以分为单位,不带小数点。</p>
<p><code>主扫</code>:用户主动扫付款二维码,也叫扫码支付,动态二维码支付。</p>
<p><code>被扫</code>:商家扫用户,也叫条码支付。</p>
<p><code>固码支付</code>:台卡、桌贴。使用公众号、服务窗统一下单。</p>
<p><code>刷卡支付</code>: (支付宝称当面付,被扫):用户打开微信/支付宝,受理端扫码微信/支付宝条码/二维码完成资金划扣的支付方式。</p>
<p><code>公众号支付</code>:用户进入微信公众号通过 JSAPI 完成资金划扣的支付方式。</p>
<p><code>扫码支付(主扫)</code>:用户进入微信/支付宝启用“扫一扫”扫描商户二维码完成资金划扣的支付方式。</p>
<p><code>APP支付</code>:APP集成微信/支付宝SDK,用户点击跳转到微信/支付宝客户端后完成资金划扣的支付方式。</p>
</li>
<li>
<ul>
<li>*</li>
</ul>
</li>
<li>
<h2><a href="#接口说明">接口说明</a></h2>
</li>
</ul>
<p><code>1.</code>被扫模式(商户扫用户微信/支付宝支付二维码):调用<[1.1 商户扫用户统一下单接口](<a href="https://www.showdoc.com.cn/jucaishangfu/9965689813455563">https://www.showdoc.com.cn/jucaishangfu/9965689813455563</a> "1.1 商户扫用户统一下单接口")>接口</p>
<p><code>2.</code>下单成功之后请轮询调用[1.5 订单查询接口](<a href="https://www.showdoc.com.cn/jucaishangfu/9965825766680565">https://www.showdoc.com.cn/jucaishangfu/9965825766680565</a> "1.5 订单查询接口")查询订单状态,订单可能处于正在支付或取消状态,请轮询订单查询接口根据订单的状态执行相应的操作</p>
<p><code>3.</code>订单状态请以查询为主,回调为辅</p>
<p><code>4.</code>回调成功,请返回字符串 <code>success</code> 说明收到回调,不然回调会继续发起,回调间隔时间<code>30S</code>,共回调<code>5</code>次</p>
<p><code>5.</code>退款只有当商户账户有资金才能退款</p>
<p><code>6.</code>订单查询可查询<code>3天内</code>的订单,超过3天的交易记录使用[1.6 历史查询接口](<a href="https://www.showdoc.com.cn/jucaishangfu/9965825376511642">https://www.showdoc.com.cn/jucaishangfu/9965825376511642</a> "1.6 历史查询接口")查询。</p>
<hr />
<ul>
<li>
<h2><a href="#请求地址">请求地址</a></h2>
</li>
</ul>
<p>>测试环境:<a href="https://dev.jucaishangfu.com">https://dev.jucaishangfu.com</a>
生产环境:</p>
<ul>
<li>
<h2><a href="#通讯方式">通讯方式</a></h2>
</li>
</ul>
<p>>通信采用<code>HTTP/HTTPS</code>协议,<code>POST</code>发送/接收<code>json</code>格式的参数。</p>
<hr />
<ul>
<li>
<h2><a href="#签名">签名</a></h2>
</li>
</ul>
<p>>采用<code>MD5</code>签名方式。</p>
<ul>
<li>
<h2><a href="#计算方法">计算方法</a></h2>
</li>
</ul>
<p>><code>1.</code> 将接口中每一个字段(<code>sign及空字段除外</code>),以字典顺序排序(<code>忽略大小写</code>)之后,按照key1=value1&key2=value2.....的顺序,进行拼接,并加上key做MD5摘要,其中key为商户密钥,系统分配。
<code>2.</code> 对得到的字符串进行MD5签名/验签</p>
<ul>
<li>
<h2><a href="#签名实例">签名实例</a></h2>
</li>
</ul>
<p>>参数:</p>
<pre><code class="language-json">{
&quot;wayCode&quot;: &quot;ALIPAY&quot;,
&quot;appId&quot;: &quot;MCH_A698612520&quot;,
&quot;body&quot;: &quot;商品描述信息&quot;,
&quot;amount&quot;: 1,
&quot;authCode&quot;: &quot;287501494802645996&quot;,
&quot;clientIp&quot;: &quot;127.0.0.1&quot;,
&quot;mchNo&quot;: &quot;MCH_I293975931&quot;,
&quot;mchOrderNo&quot;: &quot;3007202304121733422244655576&quot;,
&quot;scene&quot;: &quot;1&quot;,
&quot;sign&quot;: &quot;913d9db6e819a7a6b1b2293a5aa93041&quot;,
&quot;subject&quot;: &quot;测试支付&quot;,
&quot;termId&quot;: &quot;88888888&quot;
}</code></pre>
<p>>经过字典序排序后的字符串 (签名原文)string 为:</p>
<pre><code>amount=1&amp;appId=MCH_A698612520&amp;authCode=287501494802645996&amp;body=商品描述信息&amp;clientIp=127.0.0.1&amp;mchNo=MCH_I293975931&amp;mchOrderNo=3007202304121733422244655576&amp;scene=1&amp;subject=测试支付&amp;termId=88888888&amp;wayCode=ALIPAY&amp;key=d0194c1024f180065d2434fa8b6a2f82</code></pre>
<hr />
<p>><code>注意:</code>空值与sign字段不参与签名</p>
<ul>
<li>
<h2><a href="#签名代码示例">签名代码示例</a></h2>
<p>import com.alibaba.fastjson2.JSONObject;<br />
import com.jucai.common.core.constant.Constants;<br />
import lombok.extern.slf4j.Slf4j;<br />
import java.io.File;<br />
import java.io.FileInputStream;<br />
import java.io.IOException;<br />
import java.nio.charset.StandardCharsets;<br />
import java.security.MessageDigest;<br />
import java.security.NoSuchAlgorithmException;<br />
import java.util.ArrayList;<br />
import java.util.Arrays;<br />
import java.util.Map;<br />
import java.util.Objects; </p>
<p>/*<em><br />
/</em> @author lenovo<br />
/*
@Slf4j
public class Md5Utils {
private final static String[] hexDigits = {"0", "1", "2", "3", "4", "5",<br />
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f"}; </p>
<p>/** </p>
<ul>
<li>MD5加密 </li>
<li>
</li>
<li>@param str 待加密字符串 </li>
<li>
<p>@return String<br />
*/
public static String encode(String str) {<br />
try {<br />
//创建具有指定算法名称的摘要<br />
MessageDigest md = MessageDigest.getInstance("MD5");<br />
//使用指定的字节数组更新摘要<br />
md.update(str.getBytes());<br />
//进行哈希计算并返回一个字节数组<br />
byte[] mdBytes = md.digest();<br />
StringBuilder hash = new StringBuilder();<br />
//循环字节数组<br />
for (byte mdByte : mdBytes) {<br />
int temp;<br />
//如果有小于0的字节,则转换为正数<br />
if (mdByte < 0) {<br />
temp = 256 + mdByte;<br />
} else {<br />
temp = mdByte;<br />
} </p>
<pre><code> if (temp &lt; 16) {
hash.append(&quot;0&quot;);
}
//将字节转换为16进制后,转换为字符串
hash.append(Integer.toString(temp, 16));
}
return hash.toString(); </code></pre>
<p>} catch (NoSuchAlgorithmException e) {<br />
e.printStackTrace();<br />
}<br />
return "";<br />
} </p>
</li>
</ul>
<p>/** </p>
<ul>
<li>通过特定编码格式加密字符串 </li>
<li>
</li>
<li>@param origin 需加密的字符串 </li>
<li>@param charsetName 编码格式 </li>
<li>@return String 加密后的字符串<br />
*/<br />
public static String encode(String origin, String charsetName) {<br />
origin = origin.trim();<br />
String resultString = null;<br />
try {<br />
resultString = origin;<br />
MessageDigest md = MessageDigest.getInstance("MD5");<br />
resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetName)));<br />
} catch (Exception ignored) {<br />
}<br />
return resultString;<br />
} </li>
</ul>
<p>/** </p>
<ul>
<li>字节转换为hex </li>
<li>@param b 字节 </li>
<li>@return String<br />
*/<br />
public static String byteArrayToHexString(byte[] b) {<br />
StringBuilder resultSb = new StringBuilder();<br />
for (byte value : b) {<br />
resultSb.append(byteToHexString(value));<br />
}<br />
return resultSb.toString();<br />
} </li>
</ul>
<p>/** </p>
<ul>
<li>Java 转换byte到16进制 </li>
<li>
</li>
<li>@param b byte </li>
<li>@return String<br />
*/<br />
private static String byteToHexString(byte b) {<br />
int n = b;<br />
if (n < 0) {<br />
n = 256 + n;<br />
}<br />
int d1 = n / 16;<br />
int d2 = n % 16;<br />
return hexDigits[d1] + hexDigits[d2];<br />
} </li>
</ul>
<p>/** </p>
<ul>
<li><p><b>Description: </b>计算签名摘要 </li>
<li><p>2023年2月24日 08点56分 </li>
<li>
</li>
<li>@param map 参数Map </li>
<li>@param key 商户秘钥 </li>
<li>@return<br />
*/<br />
public static String getSign(Map<String, Object> map, String key) {<br />
String result = generateParams(map, key);<br />
result = Md5Utils.encode(result).toLowerCase();<br />
log.info("sign:{}", result);<br />
return result;<br />
} </li>
</ul>
<p>/** </p>
<ul>
<li><p><b>Description: </b>计算签名摘要 </li>
<li><p>2023年6月17日 08点56分 </li>
<li>
</li>
<li>@param map 参数Map </li>
<li>@param key 商户秘钥 </li>
<li>@return<br />
*/<br />
public static String generateSign(Map<String, Object> map, String key) {<br />
// 删除服务商号参数<br />
map.remove("orgId");<br />
String result = generateParams(map, key);<br />
result = Md5Utils.md5Encode(result, Constants.GBK).toLowerCase();<br />
log.info("sign:{}", result);<br />
return result;<br />
} </li>
</ul>
<p>/** </p>
<ul>
<li>参数组装排序 </li>
<li>
</li>
<li>@param map 请求对象 </li>
<li>@param key md5key </li>
<li>@return String<br />
*/<br />
private static String generateParams(Map<String, Object> map, String key) {<br />
ArrayList<String> list = new ArrayList<>();<br />
// 删除原签名参数<br />
map.remove("sign");<br />
for (Map.Entry<String, Object> entry : map.entrySet()) {<br />
if (null != entry.getValue() && !"".equals(entry.getValue()) && !entry.getValue().equals(new JSONObject())) {<br />
list.add(entry.getKey() + "=" + entry.getValue() + "&");<br />
}<br />
}<br />
int size = list.size();<br />
String[] arrayToSort = list.toArray(new String[size]);<br />
Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);<br />
StringBuilder sb = new StringBuilder();<br />
for (int i = 0; i < size; i++) {<br />
sb.append(arrayToSort[i]);<br />
}<br />
String result = sb.toString();<br />
result += "key=" + key;<br />
log.info("signStr:{}", result);<br />
return result;<br />
} </li>
</ul>
<p>public static String generateParamsForStar(Map<String, Object> map) {<br />
ArrayList<String> list = new ArrayList<>();<br />
for (Map.Entry<String, Object> entry : map.entrySet()) {<br />
if (null != entry.getValue()) {<br />
list.add(entry.getKey() + "=" + entry.getValue() + "&");<br />
}<br />
}<br />
int size = list.size();<br />
String[] arrayToSort = list.toArray(new String[size]);<br />
Arrays.sort(arrayToSort);<br />
StringBuilder sb = new StringBuilder();<br />
for (int i = 0; i < size; i++) {<br />
sb.append(arrayToSort[i]);<br />
}<br />
String result = sb.substring(0, sb.toString().length() - 1);<br />
log.info("signStr:{}", result);<br />
return result;<br />
} </p>
<p>/** </p>
<ul>
<li>通过特定编码格式加密字符串 </li>
<li>
</li>
<li>@param origin 需加密的字符串 </li>
<li>@param charsetName 编码格式 </li>
<li>@return String 加密后的字符串<br />
*/<br />
public static String md5Encode(String origin, String charsetName) {<br />
origin = origin.trim();<br />
String resultString = null;<br />
try {<br />
resultString = origin;<br />
MessageDigest md = MessageDigest.getInstance("MD5");<br />
resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetName)));<br />
} catch (Exception ignored) {<br />
}<br />
return resultString;<br />
} </li>
</ul>
<p>/** </p>
<ul>
<li>验证签名 </li>
<li>
</li>
<li>@param map 加密前数据 </li>
<li>@param md5Key md5key </li>
<li>@param sign 加密串 </li>
<li>@return boolean<br />
*/
public static boolean verifySign(Map map, String md5Key, String sign) {<br />
String s = getSign(map, md5Key);<br />
return s.equals(sign);<br />
} </li>
</ul>
<p>public static String hash(String s) {<br />
try {<br />
return new String(Objects.requireNonNull(toHex(md5(s))).getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);<br />
} catch (Exception e) {<br />
log.error("not supported charset...{}", e.getMessage());<br />
return s;<br />
}<br />
} </p>
<p>private static byte[] md5(String s) {<br />
MessageDigest algorithm;<br />
try {<br />
algorithm = MessageDigest.getInstance("MD5");<br />
algorithm.reset();<br />
algorithm.update(s.getBytes(StandardCharsets.UTF_8));<br />
return algorithm.digest();<br />
} catch (Exception e) {<br />
log.error("MD5 Error...", e);<br />
}<br />
return null;<br />
} </p>
<p>private static String toHex(byte[] hash) {<br />
if (hash == null) {<br />
return null;<br />
}<br />
StringBuilder buf = new StringBuilder(hash.length * 2);<br />
int i;<br />
for (i = 0; i < hash.length; i++) {<br />
if ((hash[i] & 0xff) < 0x10) {<br />
buf.append("0");<br />
}<br />
buf.append(Long.toString(hash[i] & 0xff, 16));<br />
}<br />
return buf.toString();<br />
}
}</p>
</li>
<li>
<h2><a href="#测试环境参数">测试环境参数</a></h2>
</li>
</ul>
<p>>测试商户号:<code>MCH_I293975931</code>
测试应用id(appId):<code>MCH_A698612520</code>
测试md5 key: <code>d0194c1024f180065d2434fa8b6a2f82</code></p>
<hr />
<ul>
<li>
<h2><a href="#测试注意">测试注意(重要重要!!!必看!!!!!)</a></h2>
</li>
</ul>
<p>><code>注意:</code>测试环境提供的银行间连生产测试账号是生产环境用来进行支付业务体验的账号,<code>交易中产生的一切信息均为生产环境数据</code>。用户支付需使用正式版微信、支付宝登陆用户的支付账号,使用用户的账号余额或绑定的银行卡等支付渠道进行支付。由于测试账号业务特点,不会产生清算资金划拨。所以<code>使用测试账号时请务必使用小于0.1元的小金额</code>,并请务必在支付<code>当日</code>完成退款。否则因隔日退款失败造成的测试资金损失由测试机构承担,并视为放弃资金。由于该账号为测试体验账号,所以<code>禁止将该账号用于生产业务用途,禁止在商户真实业务中使用</code>。对于将测试账号误用在商户真实业务造成的商户、用户等资金损失,由测试机构承担。 <code>使用该测试账号则视为同意上述使用协议。</code></p>
<hr />
<ul>
<li>
<h2><a href="#goodsDetail说明字段">goodsDetail说明字段</a></h2>
</li>
</ul>
<p><em>支付宝</em></p>
<pre><code>{
&quot;goods_detail&quot;: [
{
&quot;goods_id&quot;: &quot;apple-01&quot;,
&quot;alipay_goods_id&quot;: &quot;20010001&quot;,
&quot;goods_name&quot;: &quot;单品&quot;,
&quot;quantity&quot;: &quot;1&quot;,
&quot;price&quot;: &quot;0.21&quot;,
&quot;goods_category&quot;: &quot;&quot;,
&quot;categories_tree&quot;: &quot;124868003|126232002|126252004&quot;,
&quot;body&quot;: &quot;&quot;,
&quot;show_url&quot;: &quot;&quot;
}
]</code></pre>
<p>}</p>
<p><em>微信</em></p>
<pre><code>{
&quot;cost_price&quot;:608800,
&quot;receipt_id&quot;:&quot;wx123&quot;,
//注意goods_detail字段的格式为&quot;goods_detail&quot;:[{}],较多商户写成&quot;goods_detail&quot;:{}
&quot;goods_detail&quot;:
[{
&quot;goods_id&quot;:&quot;商品编码&quot;,
&quot;wxpay_goods_id&quot;:&quot;1001&quot;,
&quot;goods_name&quot;:&quot;&quot;,
&quot;quantity&quot;:1,
&quot;price&quot;:528800
},
{
&quot;goods_id&quot;:&quot;商品编码&quot;,
&quot;wxpay_goods_id&quot;:&quot;1002&quot;,
&quot;goods_name&quot;:&quot;iPhone6s 32G&quot;,
&quot;quantity&quot;:1,
&quot;price&quot;:608800
}]
}</code></pre>
<p><em>银联二维码</em> <strong><code>只支持条码支付</code></strong></p>
<pre><code>{
&quot;orderInfo&quot;:
{
&quot;title&quot; :&quot;日用品&quot;,
&quot;dctAmount&quot; :&quot;10000&quot;,
&quot;addnInfo&quot; :&quot;屈臣氏(人民广场)店&quot;
},
&quot;goodsInfo&quot;:
[{
&quot;id&quot;: &quot;1234567890&quot;,
&quot;name&quot;: &quot;商品 1&quot;,
&quot;price&quot;: &quot;500&quot;,
&quot;quantity&quot;: &quot;1&quot;
},
{
&quot;id&quot;: &quot;1234567891&quot;,
&quot;name&quot;: &quot;商品 2&quot;,
&quot;price&quot;: &quot;1000&quot;,
&quot;quantity&quot;: &quot;2&quot;,
&quot;category&quot;: &quot;类目 1&quot;,
&quot;addnInfo&quot;: &quot;商品图片 http://www.95516.com/xxx.jpg&quot;
}]
}</code></pre>
<hr />
<ul>
<li>
<h2><a href="#promotionDetail说明字段示例">promotionDetail说明字段示例</a></h2>
<p>[{
"activity_id":"12345",
"amount":"1",
"merchant_contribute":"1",
"name":"BSagiiBBXm",
"other_contribute":"0",
"promotion_id":"10000",
"scope":"GLOBAL",
"type":"DISCOUNT",
"wxpay_contribute":"0"
}]</p>
</li>
<li>
<ul>
<li>*</li>
</ul>
</li>
<li>
<h2><a href="#extendParams扩展参数说明字段示例">extendParams扩展参数说明字段示例</a></h2>
</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名</th>
<th style="text-align: left;">是否必须</th>
<th style="text-align: left;">类型</th>
<th style="text-align: left;">长度</th>
<th style="text-align: left;">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">hb_fq_num</td>
<td style="text-align: left;">非必填</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">3</td>
<td style="text-align: left;">花呗分期期数:仅支持3、6、12 银联分期模式下必传</td>
</tr>
<tr>
<td style="text-align: left;">hb_fq_seller_percent</td>
<td style="text-align: left;">非必填</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">3</td>
<td style="text-align: left;">花呗分期商家手续费比例,目前仅支持用户出资,如需使用,请填写0!目前该字段未生效,我司会默认当0处理。</td>
</tr>
<tr>
<td style="text-align: left;">industry_reflux_info</td>
<td style="text-align: left;">非必填</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">512</td>
<td style="text-align: left;">花呗分期模式:行业数据回流信息。示例值: <code>{&quot;scene_code&quot;:&quot;metro_tradeorder&quot;, &quot;channel&quot;:&quot;xxxx&quot;, &quot;scene_data&quot;:{&quot;asset_name&quot;:&quot;ALIPAY&quot;}}</code>银联分期模式:传支持的银行,格式为银行的缩写,多个银行用逗号隔开,示例:ICBC,ABC,CCB</td>
</tr>
<tr>
<td style="text-align: left;">fq_num</td>
<td style="text-align: left;">非必填</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">3</td>
<td style="text-align: left;">信用卡分期期数:仅支持3、6、12</td>
</tr>
<tr>
<td style="text-align: left;">fq_seller_percent</td>
<td style="text-align: left;">非必填</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">3</td>
<td style="text-align: left;">信用卡分期商家手续费比例,目前仅支持用户出资,如需使用,请填写0!目前该字段未生效,我司会默认当0处理。</td>
</tr>
<tr>
<td style="text-align: left;">fq_channels</td>
<td style="text-align: left;">非必填</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">20</td>
<td style="text-align: left;">优先使⽤该资产进⾏⽀付,信用卡分期时传入,目前只支持传alipayfq_cc</td>
</tr>
</tbody>
</table>
<pre><code class="language-json">{
&quot;dynamic_token_out_biz_no&quot;: &quot;66666&quot;,
&quot;hb_fq_num&quot;: &quot;3&quot;,
&quot;industry_reflux_info&quot;: {
&quot;scene_code&quot;: &quot;metro_tradeorder&quot;,
&quot;channel&quot;: &quot;xxxx&quot;,
&quot;scene_data&quot;: {
&quot;asset_name&quot;: &quot;ALIPAY&quot;
}
},
&quot;food_order_type&quot;: &quot;qr_order&quot;
}</code></pre>
<hr />
<ul>
<li>
<h2><a href="#sceneInfo场景信息说明字段示例">sceneInfo场景信息说明字段示例</a></h2>
</li>
</ul>
<table>
<thead>
<tr>
<th style="text-align: left;">序号</th>
<th style="text-align: left;">参数名</th>
<th style="text-align: left;">是否必须</th>
<th style="text-align: left;">类型</th>
<th style="text-align: left;">长度</th>
<th style="text-align: left;">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">01</td>
<td style="text-align: left;">id</td>
<td style="text-align: left;">必填</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">32</td>
<td style="text-align: left;">门店id</td>
</tr>
<tr>
<td style="text-align: left;">02</td>
<td style="text-align: left;">name</td>
<td style="text-align: left;">非必填</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">64</td>
<td style="text-align: left;">门店名称</td>
</tr>
<tr>
<td style="text-align: left;">03</td>
<td style="text-align: left;">area_code</td>
<td style="text-align: left;">非必填</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">6</td>
<td style="text-align: left;">门店行政区划码</td>
</tr>
<tr>
<td style="text-align: left;">04</td>
<td style="text-align: left;">address</td>
<td style="text-align: left;">非必填</td>
<td style="text-align: left;">String</td>
<td style="text-align: left;">128</td>
<td style="text-align: left;">门店详细地址</td>
</tr>
</tbody>
</table>
<pre><code>{
&quot;store_info&quot; : {
&quot;id&quot;: &quot;SZTX001&quot;,
&quot;name&quot;: &quot;腾大餐厅&quot;,
&quot;area_code&quot;: &quot;440305&quot;,
&quot;address&quot;: &quot;科技园中一路腾讯大厦&quot; }
}</code></pre>
<ul>
<li>
<h2><a href="#终端相关">终端相关</a></h2>
</li>
</ul>
<p>应 259 号文改造要求:
3 月 1 日起未满足 259 号文要求的条码终端设备<code>(未在银联进 行终端产品安全认证检测)</code>将无法在银联注册,<strong>服务商</strong>应在 <code>3 月 1 日前</code>将该类条码终端设 备通过终端信息采集接口进行上传,与商户绑定,银联将该类终端视为存量终端,3 月 1 日后不对存量终端做终端序列号强校验,请各位服务商提前准备好此部分商户终端资料,在 2 月 18 日至 3 月 1 日对接接口做该部分商户的终端信息绑定上送。</p>
<p>>注:3 月 1 日后增量终端设备银联将强校验终端序列号,如终端发生交易将被纳入银联检验 监控报表。</p>
<ul>
<li>
<h2><a href="#terminalInfo终端信息说明字段(259号文,终端信息)">terminalInfo终端信息说明字段(259号文,终端信息)</a></h2>
</li>
</ul>
<table>
<thead>
<tr>
<th>参数名称</th>
<th>类型</th>
<th>说明</th>
<th>是否必须</th>
</tr>
</thead>
<tbody>
<tr>
<td>terminal_type</td>
<td>String(2)</td>
<td>终端类型:01 自动柜员机(含 ATM 和 CDM) 和多媒体自助终 端 02 传统 POS 03 mPOS 04 智能 POS 05 II 型固定电话 06 云闪付终端 07 保留使用 08 手机 POS 09 刷脸付终端 10 条码支付受理终 端 11 辅助受理终端</td>
<td>Y</td>
</tr>
<tr>
<td>serial_num</td>
<td>String(50)</td>
<td>01终端设备的硬件序列号</td>
<td>N</td>
</tr>
<tr>
<td>location</td>
<td>String(32)</td>
<td>终端经纬度信息</td>
<td>N</td>
</tr>
<tr>
<td>terminal_ip</td>
<td>String(64)</td>
<td>终端设备编号</td>
<td>N</td>
</tr>
<tr>
<td>terminal_id</td>
<td>String(8)</td>
<td>终端编号</td>
<td>Y</td>
</tr>
<tr>
<td>network_license</td>
<td>String(5)</td>
<td>银行卡受理终端产品入网认证编号</td>
<td>N</td>
</tr>
<tr>
<td>secret_text</td>
<td>String(16)</td>
<td>被扫支付类交易特有信息</td>
<td>N</td>
</tr>
<tr>
<td>encrypt_rand_num</td>
<td>String(10)</td>
<td>被扫支付类交易特有信息</td>
<td>N</td>
</tr>
<tr>
<td>app_version</td>
<td>String(8)</td>
<td>终端应用程序的版本号</td>
<td>Y</td>
</tr>
<tr>
<td>mobile_country_cd</td>
<td>String(3)</td>
<td>移动国家代码</td>
<td>N</td>
</tr>
<tr>
<td>mobile_net_num</td>
<td>String(2)</td>
<td>受理终端信息</td>
<td>N</td>
</tr>
<tr>
<td>icc_id</td>
<td>String(20)</td>
<td>SIM卡卡号</td>
<td>N</td>
</tr>
<tr>
<td>location_cd1</td>
<td>String(4)</td>
<td>位置区域码1</td>
<td>N</td>
</tr>
<tr>
<td>lbs_num1</td>
<td>String(12)</td>
<td>基站编号1</td>
<td>N</td>
</tr>
<tr>
<td>lbs_signal1</td>
<td>String(4)</td>
<td>基站信号1</td>
<td>N</td>
</tr>
<tr>
<td>location_cd2</td>
<td>String(4)</td>
<td>位置区域码2</td>
<td>N</td>
</tr>
<tr>
<td>lbs_num2</td>
<td>String(12)</td>
<td>基站编号2</td>
<td>N</td>
</tr>
<tr>
<td>lbs_signal2</td>
<td>String(4)</td>
<td>基站信号2</td>
<td>N</td>
</tr>
<tr>
<td>location_cd3</td>
<td>String(4)</td>
<td>位置区域码3</td>
<td>N</td>
</tr>
<tr>
<td>lbs_num3</td>
<td>String(12)</td>
<td>基站编号3</td>
<td>N</td>
</tr>
<tr>
<td>lbs_signal3</td>
<td>String(4)</td>
<td>基站信号3</td>
<td>N</td>
</tr>
<tr>
<td>telecom_sysId</td>
<td>String(4)</td>
<td>电信系统识别码</td>
<td>N</td>
</tr>
<tr>
<td>telecom_netId</td>
<td>String(4)</td>
<td>电信网络识别码</td>
<td>N</td>
</tr>
<tr>
<td>telecom_lbs</td>
<td>String(4)</td>
<td>电信基站</td>
<td>N</td>
</tr>
<tr>
<td>telecom_lbs_signal</td>
<td>String(4)</td>
<td>电信基站信号</td>
<td>N</td>
</tr>
</tbody>
</table>
<p><em>报文示例</em></p>
<pre><code>{
&quot;location&quot;:&quot;+37.12/-121.213&quot;,
&quot;serial_num&quot;:&quot;&quot;,
&quot;encrypt_rand_num&quot;:&quot;&quot;,
&quot;secret_text&quot;:&quot;&quot;,
&quot;app_version&quot;:&quot;&quot;
}</code></pre>