NAV Navbar
Logo
示例

ULINE介绍

泓龙支付接口文档

UCHANG开发人员与商户平台服务方技术或业务人员参考和查询。

Uline-Mch-API 接口

7.1 文案约定

在您阅读文档之前,请先熟悉我们的一些约定的说法,以便您的理解

替代字符

所有用尖括号 <> 包围的字符,均为需要根据实际情况做替换的地方,特别的,<> 仅作为文档中将其区分于其他字符,您在实际使用的时候,不需要加上 <>。

变量名/假设值

所有使用行内代码,例如 dt_id,则意味着这是一个变量名,相对应的,如果是行内代码加斜体的格式,例如 /url.path,则意味着这是我们为了方便举例假设的一个具体值。

请求方法:

curl -X GET http://{ULINE_DT_API_HOST}/v1/mchinlet/authtest -H "Authorization: <your_authorization>" -H "Date: <Wed, 29 Oct 2014 02:26:58 GMT>" -H "Content-Length: <content_length>" # 其他可选参数...

注:

7.2 认证授权

Uline支持 HTTP 基本认证与签名认证两种认证授权方式。请根据需要任选其一。

7.2.1 HTTP 基本认证

将ID和APIKEY拼接后以 Base64 编码后自行在请求头部加上 Authorization 字段:比如用户id为id, APIKEY为password,那么对id:password进行编码得到aWQ6cGFzc3dvcmQ=,则标准基础认证格式则为Basic aWQ6cGFzc3dvcmQ=(看右侧示例)

curl -X GET http://{ULINE_DT_API_HOST}/v1/mchinlet/authtest -H "Authorization: Basic aWQ6cGFzc3dvcmQ="

7.2.2 签名认证

为了避免 HTTP 基本认证 Base64 可逆带来的安全隐患,REST API 还支持更为安全的签名认证

签名格式 Authorization: Uline <id>:<signature>

签名(signature)算法

签名所需的相关信息如下表:

所需信息 说明
METHOD 请求方式,如:GET、POST、PUT、HEAD 等
PATH 请求路径,需 URL 编码处理 (RFC 1738)
DATE 请求日期,GMT 格式字符串 (RFC 1123)
CONTENT_LENGTH 请求内容长度,除 GET 等无实体请求外,需和请求头部的 Content-Length 一致
APIKEY 渠道商/商户ID对应的API密匙

将上表所注的所有信息以 & 字符进行拼接(按表格从上至下的顺序)即(METHOD&PATH&DATE&CONTENT-LENGTH&APIKEY),并将所得字符串进行 MD5 散列,即得我们所需的 签名(signature)

注:

如:

假设请求方式为 GET,请求路径为 /v1/mchinlet/authtest (该URI可用于开发调试签名校检),请求时间 为 Fri, 02 Dec 2016 15:09:05 GMT,因为是 GET,所以 CONTENT-LENGTH 为 0,假设该用户ID为 1234567830,对应APIKEY为 0F222642F0FB5F5F3FCDE292516C1EF4那么:

签名(signature)即是对字符串 GET&/v1/mchinlet/authtest&Fri, 02 Dec 2016 15:09:05 GMT&0&0F222642F0FB5F5F3FCDE292516C1EF4 计算 md5 所得,即:87e8e9f3d3a1a1e73787bd3d39d21f7f,因此,只需在请求头部加上如下字段即可:

Authorization: Uline 1234567830:87e8e9f3d3a1a1e73787bd3d39d21f7f

7.3 获取商户信息

请求地址: GET /v1/mch?mch_id=<商户的mch_id>

请求参数如下:

参数 必选 说明
mch_id 商户Id

响应信息:

参数 子参数或参数类型 说明
mch_id 商户的id
mch_user 字典, 值如下 商户用户信息
status 商户的状态
wx_use_parent 是否使用大商户模式(1否,2是)
mch_payments 多个字典组成的列表, 字典的值如下 商户的支付信息
payment_rate 支付费率
payment_type 支付方式
mch_balance 字典, 值如下 商户账户信息
balance_account 结算银行卡账号
balance_name 结算户名
balance_type 结算类型(对公:1 对私:2)
balance_way 结算方式
bank_no 支行联行号(如:001100001509 请从管理后台下载得到)
id_card_no 身份证号码
mch_inlet 字典, 值如下 商户信息
province 省份
city 城市
mch_shortname 短名称
mch_name 商户名称
address 地址
auth_status 审核状态(初审中 1审核 通过 2 审核驳回 3 复审中 4)

返回示例:

{
    "code": 200,
     'mch_inlet': {
            'province': '湖北',
            'city': '武汉',
            'mch_shortname': '分润测试',
            'mch_name': '分润测试',
            'address': '街道口',
            'auth_status':1
        },
    "content": {
        "mch_balance": {
            "balance_account": "6228480128086840971",
            "balance_name": "分润测试",
            "balance_type": 1,
            "balance_way": 1,
            "bank_no": "103888876742",
            "id_card_no": "420323199110243717"
        },
        "mch_id": "100000074847",
        "mch_payments": [
            {
                "activated_status": 2,
                "payment_rate": 80,
                "payment_type": 1
            },
            {
                "activated_status": 2,
                "payment_rate": 80,
                "payment_type": 2
            },
            {
                "activated_status": 2,
                "payment_rate": 80,
                "payment_type": 3
            }
        ],
        "mch_user": {
            "status": 2,
            "wx_use_parent": 2
        }
    }
}

7.4 获取商户支付秘钥

请求地址: GET /v1/mch/mchpaykey?mch_id=<商户的mch_id>

请求参数如下:

参数 必选 说明
mch_id 商户Id

响应信息

参数 说明
mch_pay_key 商户微信支付密匙

返回示例

{
  "content": {
    "mch_pay_key": ""dvsRCvpXLHEvGAqSgRNShEdsPmT4Dh5/hF1/0aUKiK8yfwK9j1jDiwibZTFJMRPJJmBtP8ydAjg4cGnl""
  },
  "code": 200
}

返回的mch_pay_key使用AES256加密(加密密匙为32位字符串),模式为CBC,填充规则为PKCS7,加密使用的key为渠道商api_key,返回内容为16位iv+base64编码后的结果。

可以使用在线工具http://www.txtwizard.net/crypto进行测试, 具体输入的值如下:

加密代码如下(python2.7版本),java解密代码可以参照以下文章http://blog.csdn.net/firas/article/details/47043335。,请先通过http://www.bouncycastle.org/latest_releases.html下载BouncyCastle,代码参考右侧

import binascii, StringIO
from base64 import b64encode
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend


def padding(text):
    output = StringIO.StringIO()
    val = 16 - (len(text) % 16)
    for _ in xrange(val):
        output.write('{:x}'.format(val))
    return text + binascii.unhexlify(output.getvalue())


key = '1' * 32
iv = "1" * 16
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
encryptor = cipher.encryptor()

ct = encryptor.update(padding("a secret message")) + encryptor.finalize()

print iv + b64encode(ct)
# 返回内容为 1111111111111111nbzczmSkQOW15zM5b/oVn9vWM9RuBVIbFFdENWa8vew=
package demo;

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.util.Arrays;
import java.util.Random;

/**
 * Created by liyuanke on 17/3/8.
 */
public class AES {

    //算法名
    public static final String KEY_ALGORITHM = "AES";
    public static final String CIPHER_ALGORITHM = "AES/CBC/PKCS7Padding";
    public static final int KEY_LENGTH = 32;
    public static final String CHARST_NAME = "utf-8";
    public static final int IV_LENGTH = 16;

    //生成密钥
    public static byte[] generateKey(String key) throws Exception {
        if (key == null || key.length() != KEY_LENGTH) {
            System.out.print("Key长度不是" + KEY_LENGTH + "位");
            return null;
        }
        return key.getBytes(CHARST_NAME);
    }


    //生成iv
    public static AlgorithmParameters generateIV(String sIv) throws Exception {
        if (sIv != null && sIv.length() == IV_LENGTH) {
            byte[] bytes = sIv.getBytes();
            AlgorithmParameters params = AlgorithmParameters.getInstance(KEY_ALGORITHM);
            params.init(new IvParameterSpec(bytes));
            return params;
        } else {
            System.out.print("iv长度不是" + IV_LENGTH + "位");
            return null;
        }
    }

    //转化成JAVA的密钥格式
    public static Key convertToKey(byte[] key) throws Exception {
        SecretKey secretKey = new SecretKeySpec(key, KEY_ALGORITHM);
        return secretKey;
    }

    //加密
    public static String encrypt(String data, byte[] key, AlgorithmParameters iv) throws Exception {
        Security.addProvider(new BouncyCastleProvider());
        //转化为密钥
        Key secretKey = convertToKey(key);
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        //设置为加密模式
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
        byte[] bytes = data.getBytes();
        bytes = cipher.doFinal(bytes);
        String result = new BASE64Encoder().encode(bytes);
        return result;
    }

    //加密
    public static String encrypt(String data, String password, String sIv) throws Exception {
        if (sIv != null) {
            byte[] key = generateKey(password);
            AlgorithmParameters iv = generateIV(sIv);
            String encryptData = encrypt(data, key, iv);
            return sIv + encryptData;
        }
        return null;
    }

    //解密
    public static String decrypt(String encryptedData, String password) throws Exception {
        if (encryptedData != null && encryptedData.length() > IV_LENGTH) {
            byte[] key = generateKey(password);
            String sIv = encryptedData.substring(0, IV_LENGTH);
            String content = encryptedData.substring(IV_LENGTH, encryptedData.length());
            AlgorithmParameters iv = generateIV(sIv);
            return decrypt(content, key, iv);
        }
        return null;
    }

    //解密
    public static String decrypt(String encryptedData, byte[] key, AlgorithmParameters iv) throws Exception {
        Security.addProvider(new BouncyCastleProvider());
        Key secretKey = convertToKey(key);
        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        //设置为解密模式
        cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
        byte[] bytes = new BASE64Decoder().decodeBuffer(encryptedData);
        bytes = cipher.doFinal(bytes);
        String result = new String(bytes, CHARST_NAME);
        return result;
    }

    public static void main(String[] args) {
        //明文
        String plainTextString = "a secret message";
        String sIv = "1111111111111111";
        String password = "11111111111111111111111111111111";
        System.out.println("明文 : " + plainTextString);
        System.out.println("IV : " + sIv);
        System.out.println("密钥 : " + password);
        byte[] key;
        try {
            //进行加密
            String encryptedData = encrypt(plainTextString, password, sIv);
            System.out.println("加密后的数据(16位iv+base64编码) : " + encryptedData);
            //进行解密
            String data = decrypt(encryptedData, password);
            System.out.println("解密后的数据 : " + data);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

7.5 商户进件(新增)

请求地址: POST /v1/mchinlet

注意 该请求Content-Type为multipart/form-data,并不是application/json

具体细节也可参考后面的示例

请求参数如下:

参数 必选 说明
mch_name 商户名称
mch_shortname 商户简称
city 城市
province 省份(如:广东省)
district 区域(如:白云区)
address 联系地址
mobile 手机号
email 邮箱
service_phone 服务电话
bank_no 支行联行号(如:001100001509 请从管理后台下载得到)
industry_no 行业类别编号
balance_type 结算类型(对公:1 对私:2)
balance_name 结算户名
balance_account 结算银行卡号码
id_card_img_f 身份证正面照片文件
id_card_img_b 身份证反面照片文件
id_card_no 身份证号码
contact 联系人
wx_use_parent 商户是否使用appid标识(1表示不使用(默认不使用), 2表示使用)
notify_url 回调地址
WX_OFFLINE_NATIVE 微信线下扫码支付费率(万分率,如60)
WX_OFFLINE_MICROPAY 微信线下小额支付费率(万分率,如60)
WX_OFFLINE_JSAPI 微信线下公众账号支付费率(万分率,如60)
WX_ONLINE_APP 微信线上APP支付费率(万分率,如60)
WX_ONLINE_MWEB 微信线上H5支付费率(万分率,如60)
WX_ONE_NATIVE 微信千一扫码支付费率(万分率,如10)
WX_ONE_MICROPAY 微信千一小额支付费率(万分率,如10)
WX_ONE_JSAPI 微信千一公众账号支付费率(万分率,如10)
ALI_OFFLINE_NATIVE 支付宝线下扫码支付费率(万分率,如60)
ALI_OFFLINE_MICROPAY 支付宝线下刷卡支付费率(万分率,如60)
ALI_OFFLINE_JSAPI 支付宝线下JS支付费率(万分率,如60)
ALI_ZERO_NATIVE 支付宝零费率扫码支付费率(万分率,如0)
ALI_ZERO_MICROPAY 支付宝零费率刷卡支付费率(万分率,如0)
ALI_ZERO_JSAPI 支付宝零费率JS支付费率(万分率,如0)
QQ_OFFLINE_NATIVE QQ线下扫码支付费率(万分率,如60)
QQ_OFFLINE_MICROPAY QQ线下刷卡支付费率(万分率,如60)
QQ_OFFLINE_JSAPI QQ线下JS支付费率(万分率,如60)
JD_OFFLINE_NATIVE 京东线下扫码支付费率(万分率,如60)
JD_OFFLINE_MICROPAY 京东线下刷卡支付费率(万分率,如60)
JD_OFFLINE_JSAPI 京东线下JS支付费率(万分率,如60)
JD_ONLINE_NATIVE 京东线上扫码支付费率(万分率,如60)
JD_ONLINE_H5 京东H5支付费率(万分率,如60)
JD_ONLINE_H5_DEBIT 京东H5支付(借记卡)费率(万分率,如60)
UNIONPAY_OFFLINE_JSAPI 银联固定二维码费率(万分率,如60)
father_name 开通D0时必填,代表直属上级的身份,进件普通商户字段值为dt。(渠道商:dt)
wx_draw_fee D0结算-微信提现手续费(单位为分,如0.2元,应该传20,不接收小数。开通微信D0时,此字段必填,D1和D0商户只能开通一种,D1不能填写此字段)
ali_draw_fee D0结算-支付宝提现手续费(单位为分,如0.2元,应该传20,不接收小数。开通支付宝D0时,此字段必填,D1和D0商户只能开通一种,D1不能填写此字段)
wx_draw_rate D0结算-微信D0垫资费率(万分率,如2。开通微信D0时,此字段必填,D1和D0商户只能开通一种,D1不能填写此字段)
ali_draw_rate D0结算-支付宝提现手续费(万分率,如2。开通支付宝D0时,此字段必填,D1和D0商户只能开通一种,D1不能填写此字段)
license_num 营业执照注册号
license_start_date 营业执照开始时间
license_period 营业执照有效期(选择长期有效)(不提交表示非长期有效, 1表示长期有效)
license_end_date 营业执照到期时间(需要和license_period配合提交, 2者必须提交一个)
license_scope 营业执照经营范围
license_img 营业执照照片
dt_sub_id 业务员
cs_id 连锁商户的uline商户号,如果有这个字段,表示进件的是连锁门店,否则是普通商户
use_dine 是否使用围餐(不提交表示不使用, 1表示使用),使用围餐时,不能填写各种支付方式的费率,否则会报错
mch_front_img 商户门口照片,使用围餐时,必填
mch_inner_img 商户内部环境照片,使用围餐时,必填
mch_desk_img 商户收银台照片,使用围餐时,必填
annex_img1 商户进件补充材料
annex_img2 商户进件补充材料
annex_img3 商户进件补充材料
annex_img4 商户进件补充材料
annex_img5 商户进件补充材料
wx_dine_annex_img1 商户围餐补充材料图片,使用围餐时,5个商户围餐补充材料至少填一个
wx_dine_annex_img2 商户围餐补充材料图片
wx_dine_annex_img3 商户围餐补充材料图片
wx_dine_annex_img4 商户围餐补充材料图片
wx_dine_annex_img5 商户围餐补充材料图片
license_type 商户需进件到支付宝M3等级时必填, 商户营业执照类型,三选一, NATIONAL_LEGAL:营业执照, NATIONAL_LEGAL_MERGE:营业执(多证合一),INST_RGST_CTF: 事业单位法人证书
head_name 商户需进件到支付宝M3等级时必填,商户负责人姓名
head_mobile 商户需进件到支付宝M3等级时必填,商户负责人手机号码
head_type 商户需进件到支付宝M3等级时必填,商户负责人类型, 四选一,LEGAL_PERSON:法人,CONTROLLER:控制人, AGENT:代理人,OTHER:其他
activate_email_tag 选择激活邮件接收方,1代表商户,2代表渠道商
agent_id 下级代理商编号
agent_name 下级代理商名称
jd_website 商户一级域名网址, 如果商户有京东线上支付方式, jd_web_site、(jd_appname, jd_app_website)、jd_wx_id至少传递一项
jd_appname 商户应用app的名称,必须与和商户应用商店下载地址一起传递,如果商户有京东线上支付方式, jd_web_site、(jd_appname, jd_app_website)、jd_wx_id至少传递一项
jd_app_website 商户应用app的名称,必须与和商户应用app名称一起传递,如果商户有京东线上支付方式, jd_web_site、(jd_appname, jd_app_website)、jd_wx_id至少传递一项
jd_wx_id 商户微信公众号,必须与和商户应用商店中下载地址一起传递,如果商户有京东线上支付方式, jd_web_site、(jd_appname, jd_app_website)、jd_wx_id至少传递一项

响应信息

参数 说明
ul_mchid uline商户号

请求示例

POST /v1/mchinlet HTTP/1.1
Host: pay.stage.uline.cc
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: python-requests/2.13.0
Date: Thu, 01 Jun 2017 11:49:35 GMT
Content-Type: multipart/form-data; boundary=03ddacdd91c144d0a254ed8d3b0e9caa
Authorization: Uline 10000038431:5211ceab93c43f1a6dc8014cb66be962
Content-Length: 2822

--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="license_period"

1
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="license_num"

125346457659760
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="balance_account"

124532634436
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="wx_use_parent"

1
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="balance_name"

名称
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="payment_type2"

60
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="payment_type3"

60
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="payment_type1"

60
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="id_card_no"

154375487698770
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="id_card_img_b"; filename="id_card_img_b.jpg"
Content-Type: text/plain

demo
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="service_phone"

7391541653754
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="id_card_img_f"; filename="id_card_img_f.jpg"
Content-Type: text/plain

demo
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="city"

深圳市
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="mch_shortname"

测试简称
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="email"

email@gmail.com
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="bank_no"

001110002774
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="province"

广东省
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="license_img"; filename="license_img.jpg"
Content-Type: text/plain

demo
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="address"

我是地址
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="mobile"

77439665117
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="industry_no"

161215010100001
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="license_scope"

测试经营范围
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="mch_name"

测试用户名
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="balance_type"

1
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="license_start_date"

2016-11-11
--03ddacdd91c144d0a254ed8d3b0e9caa
Content-Disposition: form-data; name="contact"

联系人
--03ddacdd91c144d0a254ed8d3b0e9caa--

返回示例

{
  "content": {
    "ul_mchid": 100000012760
  },
  "code": 200
}

7.6 商户进件(修改)

POST /v1/mchinlet/update?mch_id=<商户的mch_id>

注意 该请求Content-Type为multipart/form-data,并不是application/json

请求参数如下:

参数 必选 说明
mch_name 商户名称,在初次审核通过之前可以修改并填写,但在初次审核通过之后,无法修改,不要填写
mch_shortname 商户简称
city 城市
province 省份(如:广东省)
district 区域(如:白云区)
address 联系地址
mobile 手机号
email 邮箱
service_phone 服务电话
bank_no 支行联行号(如:001100001509 请从管理后台下载得到)
industry_no 行业类别编号,在初次审核通过之前可以修改并填写,但在初次审核通过之后,无法修改,不要填写
balance_type 结算类型(对公:1 对私:2)
balance_name 结算户名
balance_account 结算银行卡号码
id_card_img_f 身份证正面照片文件
id_card_img_b 身份证反面照片文件
id_card_no 身份证号码
contact 联系人
notify_url 回调地址
WX_OFFLINE_NATIVE 微信线下扫码支付费率(万分率,如60)
WX_OFFLINE_MICROPAY 微信线下小额支付费率(万分率,如60)
WX_OFFLINE_JSAPI 微信线下公众账号支付费率(万分率,如60)
WX_ONLINE_APP 微信线上APP支付费率(万分率,如60)
WX_ONLINE_MWEB 微信线上H5支付费率(万分率,如60)
WX_ONE_NATIVE 微信千一扫码支付费率(万分率,如10)
WX_ONE_MICROPAY 微信千一小额支付费率(万分率,如10)
WX_ONE_JSAPI 微信千一公众账号支付费率(万分率,如10)
ALI_OFFLINE_NATIVE 支付宝线下扫码支付费率(万分率,如60)
ALI_OFFLINE_MICROPAY 支付宝线下刷卡支付费率(万分率,如60)
ALI_OFFLINE_JSAPI 支付宝线下JS支付费率(万分率,如60)
ALI_ZERO_NATIVE 支付宝零费率扫码支付费率(万分率,如0)
ALI_ZERO_MICROPAY 支付宝零费率刷卡支付费率(万分率,如0)
ALI_ZERO_JSAPI 支付宝零费率JS支付费率(万分率,如0)
QQ_OFFLINE_NATIVE QQ线下扫码支付费率(万分率,如60)
QQ_OFFLINE_MICROPAY QQ线下刷卡支付费率(万分率,如60)
QQ_OFFLINE_JSAPI QQ线下JS支付费率(万分率,如60)
JD_OFFLINE_NATIVE 京东线下扫码支付费率(万分率,如60)
JD_OFFLINE_MICROPAY 京东线下刷卡支付费率(万分率,如60)
JD_OFFLINE_JSAPI 京东线下JS支付费率(万分率,如60)
JD_ONLINE_NATIVE 京东线上扫码支付费率(万分率,如60)
JD_ONLINE_H5 京东H5支付费率(万分率,如60)
JD_ONLINE_H5_DEBIT 京东H5支付(借记卡)费率(万分率,如60)
UNIONPAY_OFFLINE_JSAPI 银联固定二维码费率(万分率,如60)
father_name 开通D0时必填,代表直属上级的身份,进件普通商户字段值为dt。(渠道商:dt)
wx_draw_fee D0结算-微信提现手续费(单位为分,如0.2元,应该传20,不接收小数。开通微信D0时,此字段必填,D1和D0商户只能开通一种,D1不能填写此字段)
ali_draw_fee D0结算-支付宝提现手续费(单位为分,如0.2元,应该传20,不接收小数。开通支付宝D0时,此字段必填,D1和D0商户只能开通一种,D1不能填写此字段)
wx_draw_rate D0结算-微信D0垫资费率(万分率,如2。开通微信D0时,此字段必填,D1和D0商户只能开通一种,D1不能填写此字段)
ali_draw_rate D0结算-支付宝提现手续费(万分率,如2。开通支付宝D0时,此字段必填,D1和D0商户只能开通一种,D1不能填写此字段)
license_num 营业执照注册号
license_start_date 营业执照开始时间
license_period 营业执照有效期(选择长期有效)(不提交表示非长期有效, 1表示长期有效)
license_end_date 营业执照到期时间(需要和license_period配合提交, 2者必须提交一个)
license_scope 营业执照经营范围
license_img 营业执照照片
dt_sub_id 业务员
cs_id 连锁商户的uline商户号,如果有这个字段,表示进件的是连锁门店,否则是普通商户。有审核通过之后,就不能修改
use_dine 是否使用围餐(不提交表示不使用, 1表示使用),使用围餐时,不能填写各种支付方式的费率,否则会报错。如果使用了围餐,审核通过之后就不能进行修改
mch_front_img 商户门口照片
mch_inner_img 商户内部环境照片
mch_desk_img 商户收银台照片
annex_img1 商户进件补充材料,修改直接重新上传,删除需要传递del_annex参数
annex_img2 商户进件补充材料,修改直接重新上传,删除需要传递del_annex参数
annex_img3 商户进件补充材料,修改直接重新上传,删除需要传递del_annex参数
annex_img4 商户进件补充材料,修改直接重新上传,删除需要传递del_annex参数
annex_img5 商户进件补充材料,修改直接重新上传,删除需要传递del_annex参数
del_annex 如果需要删除原来已有的进件补充材料,必须使用此参数。删除一张只需要传某张图片的下标,图片下标范围1到5对应annex_img后的数字。删除多张需要用 - 连接。如删除第三张传3,删除第一张和第三张传1-3,以此类推:1-2-3-4-5为删除所有的
wx_dine_annex_img1 商户围餐补充材料图片
wx_dine_annex_img2 商户围餐补充材料图片
wx_dine_annex_img3 商户围餐补充材料图片
wx_dine_annex_img4 商户围餐补充材料图片
wx_dine_annex_img5 商户围餐补充材料图片
del_wx_dine_annex 如果需要删除原来已有的围餐补充材料,必须使用此参数。删除一张只需要传某张图片的下标,图片下标范围1到5对应wx_dine_annex_img1后的数字。删除多张需要用 - 连接。如删除第三张传3,删除第一张和第三张传1-3,以此类推:1-2-3-4-5为删除所有的
license_type 商户营业执照类型,三选一, NATIONAL_LEGAL:营业执照, NATIONAL_LEGAL_MERGE:营业执(多证合一),INST_RGST_CTF: 事业单位法人证书
head_name 商户负责人姓名
head_mobile 商户负责人手机号码
head_type 商户负责人类型, 四选一,LEGAL_PERSON:法人,CONTROLLER:控制人, AGENT:代理人,OTHER:其他
agent_id 下级代理商编号
agent_name 下级代理商名称
jd_website 商户一级域名网址, 如果商户有京东线上支付方式, jd_web_site、(jd_appname, jd_app_website)、jd_wx_id至少存在一项
jd_appname 商户应用app的名称,必须与和商户应用商店下载地址一起传递,如果商户有京东线上支付方式, jd_web_site、(jd_appname, jd_app_website)、jd_wx_id至少存在一项
jd_app_website 商户应用app的名称,必须与和商户应用app名称一起传递,如果商户有京东线上支付方式, jd_web_site、(jd_appname, jd_app_website)、jd_wx_id至少存在一项
jd_wx_id 商户微信公众号,必须与和商户应用商店中下载地址一起传递,如果商户有京东线上支付方式, jd_web_site、(jd_appname, jd_app_website)、jd_wx_id至少存在一项

响应信息

参数 说明
ul_mchid uline商户号

返回示例

{
  "content": {
    "ul_mchid": 100000012760
  },
  "code": 200
}

7.7 审核(激活)回调

审核回调

POST 商户进件时填写的notify_url地址?event_type=check

sign字段签名算法(参照微信支付) 签名生成的通用步骤如下: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。 第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

举例: 假设传送的参数如下:

appid:    wxd930ea5d5a258f4f
mch_id:   10000100
device_info:  1000
body: test
nonce_str:    ibuaiVcKdpRxkhJA

第一步:对参数按照key=value的格式,并按照参数名ASCII字典序排序如下:

stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";

第二步:拼接API密钥:

stringSignTemp=stringA+"&key=192006250b4c09247ec02edce69f6a2d"
sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7"

如果错过了回调,可以通过获取商户信息接口判断商户是否被审核通过,接收到请求返回8个0字符串表示处理完成,系统不会重发,否则会进行五次重试

审核回调参数:

参数 必选 说明
sign 签名(参照上面签名算法说明)
mch_id 商户id
status(2为通过,1为不通过) 商户状态
comment 审核原因(主要是驳回)
message_id 消息id,同一条消息使用同一个message_id,用于识别重复发送

激活回调

POST 商户进件时填写的notify_url地址?event_type=active

接收到请求返回8个0字符串表示处理完成,系统不会重发,否则会进行五次重试

参数 必选 说明
sign 签名(同审核回调,参照上面签名算法说明)
mch_id 商户id
datas 商户所有支付类型以及状态, 例如: [{“pay_type”: 1, “status”: true}, {“pay_type”: 6, “status”: false}]
message_id 消息id,同一条消息使用同一个message_id,用于识别重复发送

7.8 设置商户微信支付配置

POST /v1/mchinlet/setwxconfig?mch_id=<商户的mch_id>

注意 该请求Content-Type为multipart/form-data,并不是application/json

请求参数如下:

参数 必选 说明
mch_type 商户的类型,mchchain中二选一mch表示为普通商户,chain表示为连锁商户
config_channel 需要配置的通道,reg_offlinereg_onlinedine中三选一reg_offline主要用于扫码、公众号、刷卡支付的配置,reg_online主要用于微信app支付,dine用于围餐通道
config_key 配置参数的名称,subscribe_appid, sub_appid, jsapi_path中三选一subscribe_appid为默认推荐关注公众号,sub_appid为关联APPID,绑定公众号、小程序、APP支付等对应的APPID,jsapi_path为公众账号JS API支付授权目录 ,要求符合URI格式规范
config_value 配置的参数值,config_key参数值为jsapi_path时,需要以http://https://开头,并以/结尾。

响应信息

参数 说明
result api请求结果,SUCCESS

返回示例

{
  "content": {
    "result": "SUCCESS"
  },
  "code": 200
}

7.9 获取商户微信配置信息

GET /v1/mchinlet/getwxconfig?mch_id=<商户的mch_id>&mch_type=<商户的类型>&config_channel=<请求的通道>

请求参数如下:

参数 必选 说明
mch_type 商户的类型,mchchain中二选一mch表示为普通商户,chain表示为连锁商户
config_channel 需要配置的通道,reg_offlinereg_onlinedine中三选一reg_offline主要用于扫码、公众号、刷卡支付的配置,reg_online主要用于微信app支付,dine用于围餐通道

响应信息

参数 说明
config_channel 请求的通道
jsapi_path_list 公众账号JS API支付授权目录列表 ,数据类型为列表,没有数据时为空列表,里面数据为字符串
appid_config_list 关联APPID列表,没有数据时为空列表,里面数据为字符串
default_subscribe 默认推荐关注appid,字符串类型
err_msg 错误信息,为空

返回示例

{
    "content": {
        "config_channel": "reg_offline",
        "jsapi_path_list": [
            "http://docs.uline.cc/",
            "http://docss.uline.cc/",
            "http://docsss.uline.cc/",
            "http://doscsss.uline.cc/",
            "http://dsoscsss.uline.cc/"
        ],
        "appid_config_list": [
            "wxa9d9651ae82ec4b9",
            "wxa9d9651ae82ec4b9"
        ],
        "err_msg": "",
        "default_subscribe": "wxa9d9651ae82ec4b9"
    },
    "code": 200
}

7.10 刷新商户微信配置信息

POST /v1/mchinlet/refreshwxconfig?mch_id=<商户的mch_id>

请求参数如下:

参数 必选 说明
mch_type 商户的类型,mchchain中二选一mch表示为普通商户,chain表示为连锁商户

响应信息

参数 说明
config_list 配置参数列表,请求微信侧后返回的信息,列表的参数如下
配置参数信息
config_channel 请求的通道,reg_offlinereg_onlinedine
jsapi_path_list 公众账号JS API支付授权目录列表 ,数据类型为列表,没有数据时为空列表,里面数据为字符串
appid_config_list 关联APPID列表,没有数据时为空列表,里面数据为字符串
default_subscribe 默认推荐关注appid,字符串类型
err_msg 错误信息,为空
{
    "content": {
        "config_list": [
            {
                "channel_type": "reg_offline",
                "jsapi_path_list": [
                    "http://docs.uline.cc/",
                    "http://docss.uline.cc/",
                    "http://docsss.uline.cc/",
                    "http://doscsss.uline.cc/",
                    "http://dsoscsss.uline.cc/"
                ],
                "appid_config_list": [
                    "wxa9d9651ae82ec4b9",
                    "wxa9d9651ae82ec4b9"
                ],
                "err_msg": "",
                "default_subscribe": "wxa9d9651ae82ec4b9"
            },
            {
                "channel_type": "reg_online",
                "jsapi_path_list": [
                    "http://docs.uline.cc/",
                    "http://docss.uline.cc/",
                    "http://docsss.uline.cc/",
                    "http://doscsss.uline.cc/",
                    "http://dsoscsss.uline.cc/"
                ],
                "appid_config_list": [
                    "wxa9d9651ae82ec4b9",
                    "wxa9d9651ae82ec4b9"
                ],
                "err_msg": "",
                "default_subscribe": "wxa9d9651ae82ec4b9"
            },
            {
                "channel_type": "dine",
                "jsapi_path_list": [
                    "http://docs.uline.cc/",
                    "http://docss.uline.cc/",
                    "http://docsss.uline.cc/",
                    "http://doscsss.uline.cc/",
                    "http://dsoscsss.uline.cc/"
                ],
                "appid_config_list": [
                    "wxa9d9651ae82ec4b9",
                    "wxa9d9651ae82ec4b9"
                ],
                "err_msg": "",
                "default_subscribe": "wxa9d9651ae82ec4b9"
            }
        ]
    },
    "code": 200
}

7.11 错误描述

API 请求失败时,服务器会返回一个 json 格式的响应体用于定位具体错误原因。如:

{
  "content": {
    "错误字段": [
      "错误描述1",
      "错误描述2"
    ]
  },
  "code": 400,
  "error": {
    "type": "错误类型"
  }
}

该响应体的字段如下:

7.12 API 错误码表

错误码 含义
400 参数错误
401 认证失败
403 未经过授权
404 URL不存在
405 未许可的方法
500 服务器错误