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\":\"\",
\"tradeType\":\"MINI\",
\"subOpenId\":\"\",
\"msgId\":\"001\",
\"srcReserve\":\"test\",
\"instMid\":\"MINIDEFAULT\",
\"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\":\"true\",
\"platformAmount\":\"1\",
\"subOrders\":\"[{\"mid\":\"898201612345678\",\"merOrderId\":\"dd20220419111222\",\"totalAmount\":\"1\"}]\",
\"notifyUrl\":\"http://www.test.com/notify\",
\"secureTransaction\":\"false\",
\"userId\":\"\",
\"limitCreditCard\":\"false\",
\"installmentNumber\":\"3\",
\"name\":\"张*三\",
\"mobile\":\"131****3453\",
\"certType\":\"IDENTITY_CARD\",
\"certNo\":\"110101********9008\",
\"fixBuyer\":\"false\",
\"retCommParams\":\"{\"foodOrderType\":\"pre_order\",\"parkId\":\"\",\"vehicleNo\":\"\"}\",
\"feeRatio\":\"5\",
\"costSubsidy\":\"默认false\",
\"preauthTransaction\":\"false\",
\"clientIp\":\"1.1.1.1\"}";
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"=>"",
"tradeType"=>"MINI",
"subOpenId"=>"",
"msgId"=>"001",
"srcReserve"=>"test",
"instMid"=>"MINIDEFAULT",
"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"=>"true",
"platformAmount"=>"1",
"subOrders"=>"json_encode(array([{"mid"=>"898201612345678","merOrderId"=>"dd20220419111222","totalAmount"=>"1"}]))",
"notifyUrl"=>"http=>//www.test.com/notify",
"secureTransaction"=>"false",
"userId"=>"",
"limitCreditCard"=>"false",
"installmentNumber"=>"3",
"name"=>"张*三",
"mobile"=>"131****3453",
"certType"=>"IDENTITY_CARD",
"certNo"=>"110101********9008",
"fixBuyer"=>"false",
"retCommParams"=>"{"foodOrderType"=>"pre_order","parkId"=>"","vehicleNo"=>""}",
"feeRatio"=>"5",
"costSubsidy"=>"默认false",
"preauthTransaction"=>"false",
"clientIp"=>"1.1.1.1"));
$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\":\"\",
\"tradeType\":\"MINI\",
\"subOpenId\":\"\",
\"msgId\":\"001\",
\"srcReserve\":\"test\",
\"instMid\":\"MINIDEFAULT\",
\"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\":\"true\",
\"platformAmount\":\"1\",
\"subOrders\":\"[{\"mid\":\"898201612345678\",\"merOrderId\":\"dd20220419111222\",\"totalAmount\":\"1\"}]\",
\"notifyUrl\":\"http://www.test.com/notify\",
\"secureTransaction\":\"false\",
\"userId\":\"\",
\"limitCreditCard\":\"false\",
\"installmentNumber\":\"3\",
\"name\":\"张*三\",
\"mobile\":\"131****3453\",
\"certType\":\"IDENTITY_CARD\",
\"certNo\":\"110101********9008\",
\"fixBuyer\":\"false\",
\"retCommParams\":\"{\"foodOrderType\":\"pre_order\",\"parkId\":\"\",\"vehicleNo\":\"\"}\",
\"feeRatio\":\"5\",
\"costSubsidy\":\"默认false\",
\"preauthTransaction\":\"false\",
\"clientIp\":\"1.1.1.1\"})
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 | |
tradeType | string | 是 | 交易类型 值为MINI | MINI | |
subOpenId | string | 是 | - | 用户子标识 微信必传,需要商户自行调用微信平台接口获取,具体获取方式请根据微信接口文档。 | |
msgId | string | 否 | <=64 | 消息ID,原样返回 | 001 |
srcReserve | string | 否 | <=255 | 请求系统预留字段 | test |
instMid | string | 否 | - | 业务类型 MINIDEFAULT | MINIDEFAULT |
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或不上送。 退货订单不允许做子订单操作 已确认的子订单,不允许隔天再确认 | true | |
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 | |
userId | string | 否 | 用户子标识 支付宝必传,需要商户自行调用支付宝接口获取,具体获取方式请根据支付宝接口文档。 | ||
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 | |
parkId | string | 否 | 32 | 停车场ID,用于支付宝停车场活动 | |
vehicleNo | string | 否 | 32 | 车牌号,用于支付宝停车场活动 | |
feeRatio | string | 否 | 手续费比例 新悦融益业务 该字段必传 | 5 | |
costSubsidy | string | 否 | 确认成本补贴 新悦融益业务 该字段必传; 是否成本补贴, true为不判断手续费比例, false按正常判断, 默认false |
默认false | |
preauthTransaction | boolean | 否 | 预授权交易标识 取值:true或false,默认false。若上送为true,则交易的金额将会被银行冻结。调用预授权完成接口后,完成部分金额会在t+1日结算给商户,剩余部分金额在用户银行卡中解冻。(仅云闪付小程序支持) | false | |
clientIp | string | 否 | - | 客户端IP 用户客户端的ip地址 | 1.1.1.1 |
响应示例
{
"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",
"miniPayRequest":
{
},
"targetMid":"",
"yxlmAmount":"100"
}
响应参数
名称 | 类型 | 必填 | 最大长度 | 描述 | 示例值 |
---|---|---|---|---|---|
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 | |
miniPayRequest | object | 否 | 小程序支付用的请求报文,带有签名信息 调用渠道支付密码框页面js参考链接 | ||
targetMid | string | 否 | 支付渠道商户号 各渠道情况不同,酌情转换。 | ||
yxlmAmount | number | 否 | 营销联盟优惠金额 仅享受联盟优惠的订单,查询返回 | 100 |