银联商务天满服务平台
Java PHP Python



import com.chinaums.open.api.OpenApiCache;
import com.chinaums.open.api.OpenApiContext;
import com.chinaums.open.api.constants.ConfigBean;
import com.chinaums.open.api.internal.util.http.HttpTransport;
import java.util.UUID;

public class OpenApiSdkTest {
    public static void main(String[] args) throws Exception{
        String url = "https://api-mop.chinaums.com/v1/netpay/bills/get-qrcode";
        //开发者ID
        String appId = "平台分配";
        //开发者秘钥
        String appKey = "平台分配";
        //实例化客户端
        ConfigBean configBean = new ConfigBean();
        OpenApiContext context = new OpenApiContext();
        String request = "{\"subMchntInfo\":\"\",
                    \"requestTimestamp\":\"2021-02-26 13:36:00\",
                    \"mid\":\"898340149000005\",
                    \"tid\":\"00000001\",
                    \"instMid\":\"QRPAYDEFAULT\",
                    \"msgId\":\"800000000010\",
                    \"srcReserve\":\"test\",
                    \"billNo\":\"8888\",
                    \"billDate\":\"2022-02-26\",
                    \"billDesc\":\"test create qrCode\",
                    \"totalAmount\":\"26\",
                    \"divisionFlag\":\"true\",
                    \"platformAmount\":\"1\",
                    \"goods\":\"[{\"goodsId\":\"001\",\"goodsName\":\"鸡蛋\",\"quantity\":\"10\",\"price\":\"1\",\"goodsCategory\":\"food meterial\",\"body\":\"two eggs\",\"subMerchantId\":\"20200225160000001sub01\",\"merOrderId\":\"988460101800201\",\"subOrderAmount\":\"1\"}]\",
                    \"subOrders\":\"[{\"mid\":\"988460101800201\",\"merOrderId\":\"988460101800201\",\"totalAmount\":\"1\"}]\",
                    \"memberId\":\"20200226001\",
                    \"counterNo\":\"06\",
                    \"expireTime\":\"2022-02-26 13:31:59\",
                    \"notifyUrl\":\"http://www.test.com/notify\",
                    \"returnUrl\":\"http://www.test.com/return\",
                    \"qrCodeId\":\"31942002267733902130410550\",
                    \"systemId\":\"31942002267733902130410550\",
                    \"secureTransaction\":\"false\",
                    \"walletOption\":\"SINGLE\",
                    \"name\":\"张*三\",
                    \"mobile\":\"131****3453\",
                    \"certType\":\"IDENTITY_CARD\",
                    \"certNo\":\"110101********9008\",
                    \"fixBuyer\":\"T\",
                    \"limitCreditCard\":\"false\",
                    \"payInfoQueryAddr\":\"测试地址\",
                    \"preauthTransaction\":\"true\",
                    \"installmentNumber\":\"1\",
                    \"retCommParams\":\"{\"foodOrderType\":\"pre_order\",\"brandId\":\"3421234\",\"storeId\":\"2412343\",\"tableNo\":\"341\",\"parkId\":\"\",\"vehicleNo\":\"\"}\",
                    \"thirdPartyInstalSubsFlag\":\"true\",
                    \"asynDivisionFlag\":\"true\",
                    \"attachedData\":\"test\",
                    \"clientIp\":\"1.1.1.1\",
                    \"isEfrcPs\":\"\",
                    \"psPpt\":\"\",
                    \"authProtocolVersion\":\"\",
                    \"authProtocolNo\":\"\",
                    \"transparentFields\":\"{\"acpCustomData\":\"\"}\"}";
        context.setStartTime(System.currentTimeMillis());
        context.setRequestId(UUID.randomUUID().toString().replace("-", ""));
        context.setOpenServUrl(url.split("/v")[0].concat("/"));
        context.setApiServiceUrl(url);
        context.setVersion(url.split("/")[3]);
        context.setAppId(appId);
        context.setAppKey(appKey);
        context.setConfigBean(configBean);
        context.setServiceCode(url.split("/v")[1].substring(1));
        OpenApiCache.getCurrentToken(context);
        System.out.println(HttpTransport.getInstance().doPost(context, request));
    }
}
<?php
require_once "../utils/Log.php";
require_once "../utils/Tools.php";
require_once "../DefaultOpenApiClient.php";
class DataRequest

{
    public $url = "";
    public $serviceCode = "";
    public $apiVersion ="";
    public $needToken = true;
    public $needDataTag = false;
    public $data;

    function __construct($data, $url)
    {
        $this->data = $data;
        $apiVersion = preg_split("/[/]+/s",$url)[2];
        $this->apiVersion = $apiVersion;
        $serviceCode = strstr($url,$apiVersion);
        $this->url = strstr($url,"/".$apiVersion,true);
        $this->serviceCode = preg_replace("/^" . preg_quote($apiVersion, "/") . "/", "", $serviceCode);
    }
}

class DataDemo{
    public function main(){
        $appid = "平台分配";
        $appkey = "平台分配";
        $url = "https://api-mop.chinaums.com/v1/netpay/bills/get-qrcode";
        $data = json_encode(array("subMchntInfo"=>"",
                    "requestTimestamp"=>"2021-02-26 13=>36=>00",
                    "mid"=>"898340149000005",
                    "tid"=>"00000001",
                    "instMid"=>"QRPAYDEFAULT",
                    "msgId"=>"800000000010",
                    "srcReserve"=>"test",
                    "billNo"=>"8888",
                    "billDate"=>"2022-02-26",
                    "billDesc"=>"test create qrCode",
                    "totalAmount"=>"26",
                    "divisionFlag"=>"true",
                    "platformAmount"=>"1",
                    "goods"=>"json_encode(array([{"goodsId"=>"001","goodsName"=>"鸡蛋","quantity"=>"10","price"=>"1","goodsCategory"=>"food meterial","body"=>"two eggs","subMerchantId"=>"20200225160000001sub01","merOrderId"=>"988460101800201","subOrderAmount"=>"1"}]))",
                    "subOrders"=>"json_encode(array([{"mid"=>"988460101800201","merOrderId"=>"988460101800201","totalAmount"=>"1"}]))",
                    "memberId"=>"20200226001",
                    "counterNo"=>"06",
                    "expireTime"=>"2022-02-26 13=>31=>59",
                    "notifyUrl"=>"http=>//www.test.com/notify",
                    "returnUrl"=>"http=>//www.test.com/return",
                    "qrCodeId"=>"31942002267733902130410550",
                    "systemId"=>"31942002267733902130410550",
                    "secureTransaction"=>"false",
                    "walletOption"=>"SINGLE",
                    "name"=>"张*三",
                    "mobile"=>"131****3453",
                    "certType"=>"IDENTITY_CARD",
                    "certNo"=>"110101********9008",
                    "fixBuyer"=>"T",
                    "limitCreditCard"=>"false",
                    "payInfoQueryAddr"=>"测试地址",
                    "preauthTransaction"=>"true",
                    "installmentNumber"=>"1",
                    "retCommParams"=>"{"foodOrderType"=>"pre_order","brandId"=>"3421234","storeId"=>"2412343","tableNo"=>"341","parkId"=>"","vehicleNo"=>""}",
                    "thirdPartyInstalSubsFlag"=>"true",
                    "asynDivisionFlag"=>"true",
                    "attachedData"=>"test",
                    "clientIp"=>"1.1.1.1",
                    "isEfrcPs"=>"",
                    "psPpt"=>"",
                    "authProtocolVersion"=>"",
                    "authProtocolNo"=>"",
                    "transparentFields"=>"{"acpCustomData"=>""}"));
        $reqiest = new DataRequest($data,$url);
        $client = new DefaultOpenApiClient();
        $content = $client->execute($reqiest,$appid,$appkey);
        $obj = json_decode($content);
        print_r($obj->errCode);
        print_r($obj->errInfo);
    }
}
$p = new DataDemo();
$p->main();
?>
# -*- coding: utf-8 -*-
from webapi.DefaultOpenApiClient import DefaultOpenApiClient

url = "https://api-mop.chinaums.com/v1/netpay/bills/get-qrcode"

class DataRequest(object):
    def __init__(self, data: dict) -> dict:
        self.data = data
        self.serviceCode = url[len(url.split("/v")[0])+len(url.split("/")[3])+1: len(url)]
        self.apiVersion = url.split("/")[3]
        self.needToken = True
        self.needDataTag = True

appId="平台分配"
appKey="平台分配"
client = DefaultOpenApiClient(appId, appKey)
cls = DataRequest({\"subMchntInfo\":\"\",
                    \"requestTimestamp\":\"2021-02-26 13:36:00\",
                    \"mid\":\"898340149000005\",
                    \"tid\":\"00000001\",
                    \"instMid\":\"QRPAYDEFAULT\",
                    \"msgId\":\"800000000010\",
                    \"srcReserve\":\"test\",
                    \"billNo\":\"8888\",
                    \"billDate\":\"2022-02-26\",
                    \"billDesc\":\"test create qrCode\",
                    \"totalAmount\":\"26\",
                    \"divisionFlag\":\"true\",
                    \"platformAmount\":\"1\",
                    \"goods\":\"[{\"goodsId\":\"001\",\"goodsName\":\"鸡蛋\",\"quantity\":\"10\",\"price\":\"1\",\"goodsCategory\":\"food meterial\",\"body\":\"two eggs\",\"subMerchantId\":\"20200225160000001sub01\",\"merOrderId\":\"988460101800201\",\"subOrderAmount\":\"1\"}]\",
                    \"subOrders\":\"[{\"mid\":\"988460101800201\",\"merOrderId\":\"988460101800201\",\"totalAmount\":\"1\"}]\",
                    \"memberId\":\"20200226001\",
                    \"counterNo\":\"06\",
                    \"expireTime\":\"2022-02-26 13:31:59\",
                    \"notifyUrl\":\"http://www.test.com/notify\",
                    \"returnUrl\":\"http://www.test.com/return\",
                    \"qrCodeId\":\"31942002267733902130410550\",
                    \"systemId\":\"31942002267733902130410550\",
                    \"secureTransaction\":\"false\",
                    \"walletOption\":\"SINGLE\",
                    \"name\":\"张*三\",
                    \"mobile\":\"131****3453\",
                    \"certType\":\"IDENTITY_CARD\",
                    \"certNo\":\"110101********9008\",
                    \"fixBuyer\":\"T\",
                    \"limitCreditCard\":\"false\",
                    \"payInfoQueryAddr\":\"测试地址\",
                    \"preauthTransaction\":\"true\",
                    \"installmentNumber\":\"1\",
                    \"retCommParams\":\"{\"foodOrderType\":\"pre_order\",\"brandId\":\"3421234\",\"storeId\":\"2412343\",\"tableNo\":\"341\",\"parkId\":\"\",\"vehicleNo\":\"\"}\",
                    \"thirdPartyInstalSubsFlag\":\"true\",
                    \"asynDivisionFlag\":\"true\",
                    \"attachedData\":\"test\",
                    \"clientIp\":\"1.1.1.1\",
                    \"isEfrcPs\":\"\",
                    \"psPpt\":\"\",
                    \"authProtocolVersion\":\"\",
                    \"authProtocolNo\":\"\",
                    \"transparentFields\":\"{\"acpCustomData\":\"\"}\"})
response = client.execute(cls)
print(str(response.get("data")))
print(response.get("errCode"))
print(response.get("errInfo"))
print(response.get("resultCode"))
print(response.get("resultInfo"))

二维码获取

URL

  • 生产环境: POST https://api-mop.chinaums.com/v1/netpay/bills/get-qrcode
  • 测试环境: POST https://test-api-open.chinaums.com/v1/netpay/bills/get-qrcode

描述:商户调用此接口获取url用以生成二维码供用户扫描付款。此接口会根据参数的不同生成3种不同的二维码: 1、一次性二维码。这种二维码可供用户进行一次支付,支付成功后不能再次使用。这种情况下billNo、billDate和totalAmount必传; 2、带金额的固定二维码。这种二维码用户扫描后可直接确认账单后付款,且可以多次重复使用。这种情况下billNo、billDate为空,totalAmount必传; 3、不带金额的固定二维码。这种二维码同样可用于多次付款,但是用户在扫码后需要自己输入支付金额。这种情况下billNo、billDate和totalAmount都为空。

  • 对于一次性二维码,商户需自行生成billNo。此时billNo需要符合银商规范,以银商分配的4位来源编号(msgSrcId)作为账单号的前4位,且在商户系统中此账单号保证唯一。总长度需大于6位,小于32位。 银商的推荐规则为(无特殊情况下,建议遵守此规则): {来源编号(4位)}{时间(yyyyMMddmmHHssSSS)(17位)}{7位随机数}- 如果商户需要自主生成二维码,需调用二维码获取接口上送账单信息。此业务场景下,qrCodeId必传。
  • 二维码生成规范 {baseUrl}/bills/qrCode.do?id={qrCodeId} * baseUrl取值范围 测试环境:https://qr-test2.chinaums.com 生产环境:https://qr.chinaums.com * qrCodeId生成规范:qrCodeId = {来源编号(4位)}{时间(yyyyMMddmmHHssSSS)(17位)}{11位随机数}

ContentType:HTTP(S) + JSON

请求头

名称 必填 描述 示例值
Authorization 认证内容 (认证参考天满开发者中心->接入指引->平台认证方式:开发者中心 OPEN-BODY-SIG AppId="****",Timestamp="20170606135700",Nonce="99930a147f5353dd8a8f29a5329f37e9",Signature="IPmdGHYCcfN+mto0/02zkwoUF1NT3YqPKaUykMaec1T="

请求参数

名称 类型 必填 最大长度 描述 示例值
subMchntInfo string 100 二级商户信息 格式参见:{"subMerId":"89812345","subMerName":"我是商户名"},其中subMerId最长20字节,subMerName最长100字节
requestTimestamp string - 报文请求时间 格式:yyyy-MM-dd HH:mm:ss 2021-02-26 13:36:00
mid string 15 商户号 898340149000005
tid string 8 终端号 00000001
instMid string - 业务类型 QRPAYDEFAULT QRPAYDEFAULT
msgId string 64 消息ID 原样返回 800000000010
srcReserve string 255 请求系统预留字段 test
billNo string 31 账单号 重要,参考二维码获取规范 8888
billDate string - 账单日期 格式yyyy-MM-dd 2022-02-26
billDesc string 255 账单描述 不超过128个汉字 test create qrCode
totalAmount number 100000000 支付总金额 重要,单位:分 26
divisionFlag boolean - 分账标记 默认值为false 暂时只支持微信(WXPay.jsPay)、支付宝(trade.jsPay)支付和银联云闪付(银联二维码渠道)。 若为true,则goods字段和subOrders字段不能同时为空(建议使用subOrders字段),且secureTransaction字段上送false或不上送。 true
platformAmount number - 平台商户分账金额 若分账标记传,则分账金额必传。单位:分 1
goods array 商品信息 详见接口下方备注部分
   goodsId string - 商品ID 001
   goodsName string - 商品名称 鸡蛋
   quantity string - 商品数量 10
   price string - 商品单价,单位:分 1
   goodsCategory string - 商品分类 food meterial
   body string - 商品说明 two eggs
   subMerchantId string 15 子商户号 20200225160000001sub01
   merOrderId string 32 商户子订单号 988460101800201
   subOrderAmount number 100000000 子商户商品总额 ,单位:分 1
subOrders array 子订单信息 详见接口下方备注部分
   mid string 15 子商户号 988460101800201
   merOrderId string 32 商户子订单号 988460101800201
   totalAmount number 100000000 子商户分账金额,单位:分 1
memberId string 32 会员号 支付通知里原样返回 20200226001
counterNo string 32 桌号、柜台号、房间号 支付通知里原样返回 06
expireTime string - 账单过期时间,格式yyyy-MM-dd HH:mm:ss 一次性二维码的默认过期时间为30分钟,最长为90天,固定码默认值是10年 (获取的二维码若显示在自助机上等类似业务,该字段为必传) 2022-02-26 13:31:59
notifyUrl string - 支付结果通知地址 接受支付通知的商户服务url http://www.test.com/notify
returnUrl string - 支付结果回跳商户页面 http://www.test.com/return
qrCodeId string 32 二维码ID 针对需要自行生成二维码的情况 31942002267733902130410550
systemId string 32 系统ID 31942002267733902130410550
secureTransaction string - 担保交易标识 取值:true或false,默认false若上送为true,则交易的金额将会被暂缓结算。调用担保完成接口后,完成部分金额会在t+1日结算给商户,剩余部分金额退还用户。调用担保撤销接口,则全部资金退还给用户。30天后没有主动调用担保完成 且 没有主动调用担保撤销的交易 将会自动按撤销处理。 false
walletOption string - 钱包选项 说明:1.单一钱包支付传SINGLE(支付过程中不能切换钱包), 多钱包支付传MULTIPLE SINGLE
name string 32 实名认证姓名 Base64编码 张*三
mobile string 20 实名认证手机号 Base64编码 131****3453
certType string - 实名认证证件类型 IDENTITY_CARD
certNo string 32 实名认证证件号 Base64编码 110101****9008
fixBuyer string 32 是否需要实名认证 需要实名认证时置为T T
limitCreditCard string - 是否需要限制信用卡支付 取值:true或false,默认false false
payInfoQueryAddr string - 支付要素查询地址 去商户那里查询支付要素的接口地址,见第9节 固定二维码支付要素查询接口规范。提醒:一次性码支付不用上送 测试地址
preauthTransaction string - 预授权交易标识 取值:true或false,默认false(目前仅有一次性银联聚合码支持该业务) 若上送为true,则交易的金额将会被银行冻结。 调用预授权完成接口后,完成部分金额会在t+1日结算给商户,剩余部分金额在用户银行卡中解冻。 +调用预授权撤销接口,则用户资金在银行解冻。 +30天后 没有主动调用预授权完成 且 没有主动调用预授权撤销的交易,将会自动解冻。 true
installmentNumber number 3612 花呗分期数 仅支持支付宝 1
retCommParams object 扫码点餐信息
扫码点餐信息,支付宝只需上送扫码foodOrderType字段,云闪付只需上送brandId、storeId、tableNo字段提醒:
1.请求报文中retCommParams字段示例如{"brandId":"MY_STYLE","storeId":"S001","tableNo":"T001"}(见文档请求示例报文)
2.二级字段foodOrderType最大长度为32位。
   foodOrderType string 32 扫码点餐字段
扫码点餐类型取值:
qr_order:店内扫码点餐
pre_order:预点到店自提
home_delivery:外送到家
direct_payment:直接付款
other:其他
pre_order
   brandId string 32 品牌标识 3421234
   storeId string 32 门店标识 2412343
   tableNo string 32 桌号 341
   parkId string 32 停车场ID,用于支付宝停车场活动
   vehicleNo string 32 车牌号,用于支付宝停车场活动
thirdPartyInstalSubsFlag boolean - 是否开启第三方分期交易贴息 true为本笔交易启用第三方贴息,false或者不传为本笔交易不启用第三方贴息。目前只针对花呗分期交易。 true
asynDivisionFlag boolean - 异步分账标记 若为true,则goods字段和subOrders字段不能同时为空(建议使用subOrders字段);且secureTransaction字段上送false或不上送。 退货订单不允许做子订单操作 已确认的子订单,不允许隔天再确认 true
attachedData string 255 商户附加数据 test
clientIp string - 客户端IP 用户客户端的ip地址 1.1.1.1
isEfrcPs boolean - 是否强制输入附言
psPpt string 60 附言提示语
authProtocolVersion string 64 实名认证合同版本号,云闪付实名必传,由前端按实际版本号传,示例“V1”
authProtocolNo string - 实名认证合同协议号,云闪付实名必传,商户采集用户信息的授权协议信息,协议号唯一
transparentFields object
   acpCustomData string - 银联二维码渠道 目前仅银联二维码BC和聚合码交易才会透传到渠道

响应示例

{
  "errCode":"SUCCESS",
  "errMsg":"查询二维码成功",
  "responseTimeStamp":"2020-02-26 13:39:02",
  "billQRCode":"https://qr-test2.chinaums.com/bills/qrCode.do?id=31942002267733902130410550",
  "systemId":"34123443",
  "msgId":"800000000010",
  "srcReserve":"test",
  "mid":"898340149000005",
  "tid":"00000001",
  "instMid":"QRPAYDEFAULT",
  "billNo":"31942002267733902130410550",
  "billDate":"2020-02-26"
}

响应参数

名称 类型 必填 最大长度 描述 示例值
errCode string - 错误代码
平台错误码
业务错误码
SUCCESS
errMsg string - 错误说明 查询二维码成功
responseTimeStamp string - 报文应答时间 格式:yyyy-MM-dd HH:mm:ss 2020-02-26 13:39:02
billQRCode string - 账单二维码 二维码URL https://qr-test2.chinaums.com/bills/qrCode.do?id=31942002267733902130410550
systemId string - 系统ID,原样返回 34123443
msgId string 64 消息ID,原样返回 800000000010
srcReserve string 255 请求系统预留字段 test
mid string - 商户号,原样返回 898340149000005
tid string - 终端号,原样返回 00000001
instMid string - 业务类型,原样返回 QRPAYDEFAULT QRPAYDEFAULT
billNo string - 账单号,原样返回 31942002267733902130410550
billDate string - 账单日期,原样返回 2020-02-26

错误码