银联商务天满服务平台
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/wx/unified-order";
        //开发者ID
        String appId = "平台分配";
        //开发者秘钥
        String appKey = "平台分配";
        //实例化客户端
        ConfigBean configBean = new ConfigBean();
        OpenApiContext context = new OpenApiContext();
        String request = "{\"requestTimestamp\":\"2022-04-20 10:10:13\",
                    \"merOrderId\":\"327M20220419111222\",
                    \"mid\":\"898201612345678\",
                    \"tid\":\"88880001\",
                    \"totalAmount\":\"1\",
                    \"subAppId\":\"\",
                    \"msgId\":\"001\",
                    \"srcReserve\":\"test\",
                    \"instMid\":\"APPDEFAULT\",
                    \"goods\":\"[{\"goodsId\":\"001\",\"goodsName\":\"鸡蛋\",\"quantity\":\"10\",\"price\":\"1\",\"goodsCategory\":\"food meterial\",\"body\":\"two eggs\",\"unit\":\"个\",\"discount\":\"5\",\"subMerchantId\":\"988460101800201\",\"merOrderId\":\"dd20220419111222\",\"subOrderAmount\":\"100\"}]\",
                    \"attachedData\":\"\",
                    \"expireTime\":\"2022-04-22 10:10:13\",
                    \"goodsTag\":\"\",
                    \"orderDesc\":\"测试\",
                    \"originalAmount\":\"10\",
                    \"productId\":\"002\",
                    \"divisionFlag\":\"true\",
                    \"asynDivisionFlag\":\"\",
                    \"platformAmount\":\"1\",
                    \"subOrders\":\"[{\"mid\":\"898201612345678\",\"merOrderId\":\"dd20220419111222\",\"totalAmount\":\"1\"}]\",
                    \"notifyUrl\":\"http://www.test.com/notify\",
                    \"secureTransaction\":\"false\",
                    \"goodsTradeNo\":\"\",
                    \"showUrl\":\"MINI\",
                    \"limitCreditCard\":\"false\",
                    \"installmentNumber\":\"3\",
                    \"name\":\"张*三\",
                    \"mobile\":\"131****3453\",
                    \"certType\":\"IDENTITY_CARD\",
                    \"certNo\":\"110101********9008\",
                    \"fixBuyer\":\"false\",
                    \"retCommParams\":\"{\"foodOrderType\":\"pre_order\"}\",
                    \"feeRatio\":\"5\",
                    \"costSubsidy\":\"默认false\",
                    \"placeOrderScene\":\"false\",
                    \"clientIp\":\"1.1.1.1\",
                    \"tradeType\":\"\",
                    \"merchantUserId\":\"\",
                    \"enablePayChnl\":\"\",
                    \"thirdPartyInstalSubsFlag\":\"\",
                    \"supportBank\":\"\",
                    \"invokeType\":\"\",
                    \"bankCardNo\":\"\",
                    \"creditFeeRatio\":\"\"}";
        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/wx/unified-order";
        $data = json_encode(array("requestTimestamp"=>"2022-04-20 10=>10=>13",
                    "merOrderId"=>"327M20220419111222",
                    "mid"=>"898201612345678",
                    "tid"=>"88880001",
                    "totalAmount"=>"1",
                    "subAppId"=>"",
                    "msgId"=>"001",
                    "srcReserve"=>"test",
                    "instMid"=>"APPDEFAULT",
                    "goods"=>"json_encode(array([{"goodsId"=>"001","goodsName"=>"鸡蛋","quantity"=>"10","price"=>"1","goodsCategory"=>"food meterial","body"=>"two eggs","unit"=>"","discount"=>"5","subMerchantId"=>"988460101800201","merOrderId"=>"dd20220419111222","subOrderAmount"=>"100"}]))",
                    "attachedData"=>"",
                    "expireTime"=>"2022-04-22 10=>10=>13",
                    "goodsTag"=>"",
                    "orderDesc"=>"测试",
                    "originalAmount"=>"10",
                    "productId"=>"002",
                    "divisionFlag"=>"true",
                    "asynDivisionFlag"=>"",
                    "platformAmount"=>"1",
                    "subOrders"=>"json_encode(array([{"mid"=>"898201612345678","merOrderId"=>"dd20220419111222","totalAmount"=>"1"}]))",
                    "notifyUrl"=>"http=>//www.test.com/notify",
                    "secureTransaction"=>"false",
                    "goodsTradeNo"=>"",
                    "showUrl"=>"MINI",
                    "limitCreditCard"=>"false",
                    "installmentNumber"=>"3",
                    "name"=>"张*三",
                    "mobile"=>"131****3453",
                    "certType"=>"IDENTITY_CARD",
                    "certNo"=>"110101********9008",
                    "fixBuyer"=>"false",
                    "retCommParams"=>"{"foodOrderType"=>"pre_order"}",
                    "feeRatio"=>"5",
                    "costSubsidy"=>"默认false",
                    "placeOrderScene"=>"false",
                    "clientIp"=>"1.1.1.1",
                    "tradeType"=>"",
                    "merchantUserId"=>"",
                    "enablePayChnl"=>"",
                    "thirdPartyInstalSubsFlag"=>"",
                    "supportBank"=>"",
                    "invokeType"=>"",
                    "bankCardNo"=>"",
                    "creditFeeRatio"=>""));
        $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/wx/unified-order"

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({\"requestTimestamp\":\"2022-04-20 10:10:13\",
                    \"merOrderId\":\"327M20220419111222\",
                    \"mid\":\"898201612345678\",
                    \"tid\":\"88880001\",
                    \"totalAmount\":\"1\",
                    \"subAppId\":\"\",
                    \"msgId\":\"001\",
                    \"srcReserve\":\"test\",
                    \"instMid\":\"APPDEFAULT\",
                    \"goods\":\"[{\"goodsId\":\"001\",\"goodsName\":\"鸡蛋\",\"quantity\":\"10\",\"price\":\"1\",\"goodsCategory\":\"food meterial\",\"body\":\"two eggs\",\"unit\":\"个\",\"discount\":\"5\",\"subMerchantId\":\"988460101800201\",\"merOrderId\":\"dd20220419111222\",\"subOrderAmount\":\"100\"}]\",
                    \"attachedData\":\"\",
                    \"expireTime\":\"2022-04-22 10:10:13\",
                    \"goodsTag\":\"\",
                    \"orderDesc\":\"测试\",
                    \"originalAmount\":\"10\",
                    \"productId\":\"002\",
                    \"divisionFlag\":\"true\",
                    \"asynDivisionFlag\":\"\",
                    \"platformAmount\":\"1\",
                    \"subOrders\":\"[{\"mid\":\"898201612345678\",\"merOrderId\":\"dd20220419111222\",\"totalAmount\":\"1\"}]\",
                    \"notifyUrl\":\"http://www.test.com/notify\",
                    \"secureTransaction\":\"false\",
                    \"goodsTradeNo\":\"\",
                    \"showUrl\":\"MINI\",
                    \"limitCreditCard\":\"false\",
                    \"installmentNumber\":\"3\",
                    \"name\":\"张*三\",
                    \"mobile\":\"131****3453\",
                    \"certType\":\"IDENTITY_CARD\",
                    \"certNo\":\"110101********9008\",
                    \"fixBuyer\":\"false\",
                    \"retCommParams\":\"{\"foodOrderType\":\"pre_order\"}\",
                    \"feeRatio\":\"5\",
                    \"costSubsidy\":\"默认false\",
                    \"placeOrderScene\":\"false\",
                    \"clientIp\":\"1.1.1.1\",
                    \"tradeType\":\"\",
                    \"merchantUserId\":\"\",
                    \"enablePayChnl\":\"\",
                    \"thirdPartyInstalSubsFlag\":\"\",
                    \"supportBank\":\"\",
                    \"invokeType\":\"\",
                    \"bankCardNo\":\"\",
                    \"creditFeeRatio\":\"\"})
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/wx/unified-order
  • 测试环境: POST https://test-api-open.chinaums.com/v1/netpay/wx/unified-order

描述:本接口为商户的订单信息发向银商网络支付前置系统以获取支付要素商户需遵循商户订单号生成规范,即以银商分配的4位来源编号作为账单号的前4位,且在商户系统中此账单号保证唯一。总长度需大于6位,小于32位。银商的推荐规则为(无特殊情况下,建议遵守此规则) 如果需要实名认证,请遵循以下规则: 微信必传姓名name、证件号certNo、强制校验位fixBuyer=T; 支付宝必传姓名name,证件类型certType,证件号certNo,强制校验位fixBuyer=T。注意:支付宝支持的证件类型包括:身份证IDENTITY_CARD、护照PASSPORT、军官证OFFICER_CARD、士兵证SOLDIER_CARD、户口本HOKOU; 云闪付实名认证必传证件类型certType,证件号certNo,强制校验位fixBuyer=T。姓名name选传。注意:云闪付支持的证件类型包括:身份证IDENTITY_CARD、护照PASSPORT、军官证OFFICER_CARD、士兵证SOLDIER_CARD、港澳居民通行证HM_EXIT、台湾居民通行证TW_EXIT、警官证POLICE_CERTIFICATE、外国护照FOREIGNER_RESIDENCE_PERMIT、港澳居民居住证HM_RESIDENCE_PERMIT、台湾居民居住证TW_RESIDENCE_PERMIT 、其他OTHER。云闪付实名当证件类型为IDENTITY_CARD(身份证)时,certNo支持上送身份证号后6位,注意当身份证号最后一位是X时,上送X前面的6位数字; 敏感信息如姓名、证件号和手机号信息需要base64编码。{来源编号(4位)}{时间(yyyyMMddmmHHssSSS)(17位)}{11位随机数}

ContentType:HTTP(S)

请求头

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

请求参数

名称 类型 必填 最大长度 描述 示例值
requestTimestamp string 报文请求时间 格式yyyy-MM-dd HH:mm:ss 2022-04-20 10:10:13
merOrderId string 6..32 商户订单号 商户自行生成 327M20220419111222
mid string 8..32 商户号 898201612345678
tid string 2..32 终端号 88880001
totalAmount number 1..100000000 支付总金额 单位分 若divisionFlag为true,则: totalAmount =subOrders字段中的所有totalAmount值之和+platformAmount值 =goods中的所有subOrderAmount值之和。 1
subAppId string <=32 微信子商户appId 值为app应用在微信开放平台分配的appid
msgId string <=64 消息ID,原样返回 001
srcReserve string <=255 请求系统预留字段 test
instMid string - 机构商户号 APPDEFAULT
goods array 商品信息
   goodsId string <=64 商品ID 001
   goodsName string <=256 商品名称 鸡蛋
   quantity number 商品数量 10
   price number 商品单价,单位:分 1
   goodsCategory string <=64 商品分类 food meterial
   body string <=1024 商品说明 two eggs
   unit string 商品单位
   discount number 商品折扣 5
   subMerchantId string 8..32 子商户号 988460101800201
   merOrderId string 6..32 商户子订单号 dd20220419111222
   subOrderAmount number 0..100000000 子商户商品总额,单位:分 100
attachedData string <=255 商户附加数据
expireTime string 订单过期时间 为空则使用系统默认过期时间(30分钟),格式yyyy-MM-dd HH:mm:ss 2022-04-22 10:10:13
goodsTag string <=32 商品标记 用于优惠活动
orderDesc string <=255 账单描述 微信支付时 上送值长度不超过128字节 测试
originalAmount number 1..100000000 订单原始金额 单位分,用于记录前端系统打折前的金额 10
productId string 商品ID 002
divisionFlag boolean 分账标记 若为true,则goods字段和subOrders字段不能同时为空;且secureTransaction字段上送false或不上送。 true
asynDivisionFlag boolean - 异步分账标记 若为true,则goods字段和subOrders字段不能同时为空; 且secureTransaction字段上送false或不上送。 退货订单不允许做子订单操作 已确认的子订单,不允许隔天再确认
platformAmount number 1..100000000 平台商户分账金额 若分账标记传,则分账金额必传 1
subOrders array 子订单信息 在传分账标记的情况下,若传子商户号,子商户分账金额必传,即ubOrders每个元素的mid和totalAmount非空且mid不超过20个。(分账方案subOrders里子商户分账总额+platformAmount要与支付总额totalAmount相等)。 在传分账标记的情况下,接口中goods和subOrders二者必传其一;若传goods则分账信息会按goods中每个商品的总额占支付总额减平台分账金额等比例生成;若传subOrders,则分账信息则严格按subOrders里的分账方案生成。
   mid string 15 子商户号 898201612345678
   merOrderId string 6..32 商户子订单号 dd20220419111222
   totalAmount number 0..100000000 子商户分账金额 1
notifyUrl string <=255 支付结果通知地址 http://www.test.com/notify
secureTransaction string 担保交易标识 取值:true或false,默认false 若上送为true,则交易的金额将会被暂缓结算。 调用担保完成接口后,完成部分金额会在t+1日结算给商户,剩余部分金额退还用户。 调用担保撤销接口,则全部资金退还给用户。 30天后没有主动调用担保完成 且 没有主动调用担保撤销的交易 将会自动按撤销处理。 false
goodsTradeNo string 商品交易单号 跟goods字段二选一,商品信息通过goods.add接口提前上送
showUrl string <=255 订单展示页面 MINI
limitCreditCard string 是否需要限制信用卡支付 取值:true或false,默认false false
installmentNumber number 花呗分期数 取值:仅支持3、6、12 3
name string <=32 实名认证姓名 Base64编码 张*三
mobile string <=20 实名认证手机号 Base64编码 131****3453
certType string 实名认证证件类型 IDENTITY_CARD
certNo string <=64 实名认证证件号 Base64编码 银联云闪付支持上送身份证后六位(当身份证最后一位是 X时,上送 X前面的 6位数字),注意同样需要Base64编码 110101****9008
fixBuyer string <=32 是否需要实名认证 需要实名认证时置为T false
retCommParams object 返佣字段 目前支持支付宝渠道
   foodOrderType string 扫码点餐字段 pre_order pre_order
feeRatio string 手续费比例 新悦融益业务 该字段必传 5
costSubsidy string 确认成本补贴 新悦融益业务 该字段必传;
是否成本补贴,
true为不判断手续费比例,
false按正常判断,
默认false
默认false
placeOrderScene boolean <=200 下单场景 false
clientIp string - 客户端IP 用户客户端的ip地址 1.1.1.1
tradeType string - 交易类型 微信必传:APP
merchantUserId string 32 商户用户号 applepay下单时 必传
enablePayChnl string 128 指定支付方式 商户可通过上传该字段,指定想要支持的支付方式(仅支持支付宝交易)。 一笔订单中仅允许商户一次上送一个值,可上送的取值范围为:balance(余额),moneyFund(余额宝),pcredit(花呗),pcreditpayInstallment(花呗分期),creditCard(信用卡),debitCardExpress(借记卡)
thirdPartyInstalSubsFlag boolean - 是否开启第三方分期交易贴息 true为本笔交易启用第三方贴息,false或者不传为本笔交易不启用第三方贴息,目前只针对花呗分期交易商户贴息的场景。
supportBank string 40 支持的银行 仅支持云闪付支付 支持直接拉起特定银行APP
invokeType string 16 调起方式 仅支持云闪付支付 在统一收银台直通模式业务下,商户调起银行APP的方式 APP_H5:APP+H5 APP:APP H5:H5 默认取值APP_H5。 若上送此字段,则必须上送supportBank字段,否则将拒绝交易。
bankCardNo string 28 银行卡号 Base64编码 银联云闪付可指定卡号付款
creditFeeRatio string - 贷记卡手续费比例 目前提供给yry的特殊字段,手续费比例,需要按照产品提供的规则上送

响应示例

{
  "errCode":"SUCCESS",
  "errMsg":"微信下单",
  "responseTimestamp":"2022-04-20 10:10:13",
  "mid":"898310148160568",
  "tid":"88880001",
  "msgId":"001",
  "srcReserve":"test",
  "merName":"测试商户",
  "merOrderId":"13DA002023071900000000003327",
  "seqId":"20230719162959",
  "settleRefId":"20230719162959",
  "status":"WAIT_BUYER_PAY",
  "totalAmount":"500",
  "targetOrderId":"64342023071922595938541723006782",
  "targetSys":"WXPay",
  "targetStatus":"SUCCESS|SUCCESS",
  "jsPayRequest":
  {

  },
  "targetMid":"",
  "yxlmAmount":"100",
  "appPayRequest":
  {

  },
  "prepayId":"",
  "qrCode":""
}

响应参数

名称 类型 必填 最大长度 描述 示例值
errCode string <=64 错误代码
平台错误码
业务错误码
SUCCESS
errMsg string <=255 错误说明 微信下单
responseTimestamp string 报文响应时间 格式yyyy-MM-dd HH:mm:ss 2022-04-20 10:10:13
mid string 商户号 898310148160568
tid string 终端号 88880001
msgId string <=64 消息ID 001
srcReserve string <=255 请求系统预留字段 test
merName string 商户名称 测试商户
merOrderId string 商户订单号 13DA002023071900000000003327
seqId string 平台流水号 20230719162959
settleRefId string 清分ID 如果来源方传了bankRefId就等于bankRefId,否则等于seqId 20230719162959
status string 交易状态 WAIT_BUYER_PAY
totalAmount number 支付总金额 500
targetOrderId string 第三方订单号 64342023071922595938541723006782
targetSys string 目标平台代码 WXPay
targetStatus string 目标平台状态 SUCCESS
jsPayRequest object JSAPI支付用的请求报文,带有签名信息
targetMid string 支付渠道商户号 各渠道情况不同,酌情转换。
yxlmAmount number 营销联盟优惠金额 仅享受联盟优惠的订单,查询返回 100
appPayRequest object - APP支付用的请求报文,带有签名信息
prepayId string 64 支付ID,用于APP支付和公众号支付
qrCode string 64 支付二维码,内容为URL,由终端转换成二维码显示

错误码