接入流程指引
测试环境资料
示例Demo(持续完善...)
测试商户号
该商户号仅供使用于测试环境(调用测试环境接口地址),测试环境接口调试,不会涉及真实的资金。此商户号为公共测试商户号,若需要单独申请测试商户号,可以联系技术支持申请。测试商户号为动态配置,仅供参考。生产商户号默认无免密免验额度,额度为方便快速测试所设,且二级户开户需要开户意愿。若无特配申请,请按生产商户号配置联调。
商户号(mch_id):2020042200284052
PHP语言使用pkcs1格式,Java语言、C#语言使用pkcs8格式
该商户号私钥(pkcs1格式):
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDw/pmpStlt1CV31+azu/YEVGy3vpMArJMO1cxE1wOEH/+VVpT8Tm9ekpX5ZBOM8iJ4RsHoY1E71z73mzbWSSaSkvkP+6FsOoTENXCAvfQ1plejq47c+tU5ouQP+EJ2KlJthkUnH658iC0MPf6opJL8o6NKT7CDE9q4Zrt9S0skjQIDAQABAoGBAKJGrm3iqtpbugci6IQqkxSDTNnFh/MyQawBpxTLu+BiM5X5wUTMBA4oorhV/Rwxh6h57ORwzCiBXjMY3yoYA9Hsad0tOsaUm5pCG71izPsQZe9P/kixu8M7WeCrXSruz0dusSYbeszPyg66L7kcxWDQemW8jtzMvQiV2mUuhlP5AkEA/v8LH9DOwcqfrD88t0hJ/JGrRaKVTs/KBEgQbkjTV5da4Mln4FVwVCkQwLrPKGvzYcds1jaqbnIax3qz6eTHBwJBAPHxconVuJzJC98eFC0Jm7GQarDRF6Cr93ww7x1kZY19ABJXpfl2lbsa7aWIg8cKhUjNLPdpwgY9mV7eDvndnssCQEuZhczK9WGTFz/UB8Y3EmhlL6gXibix9izKyMRJpw7i+riGPdvOuNzax/K778sGJkQpAeWIk4LnJXVatZh0kWUCQGJ8vPlq7Km2FYUPw3rJ7H0NosCzfQDEwAvoB45ZbhV4iuzsjP3NzgnKXm8B8VK276bBDsrwXDEaJjK+Bi6kjp0CQHAyqF6ZGBRmpHo5+i0I+exAbTIH1TWrU4qQZ0MT2hzBhjvVfUs3nW5IDYNDQUs7DbGripxTsvshcBan+qBh5tA=
-----END RSA PRIVATE KEY-----
该商户号公钥(pkcs1格式):
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDw/pmpStlt1CV31+azu/YEVGy3vpMArJMO1cxE1wOEH/+VVpT8Tm9ekpX5ZBOM8iJ4RsHoY1E71z73mzbWSSaSkvkP+6FsOoTENXCAvfQ1plejq47c+tU5ouQP+EJ2KlJthkUnH658iC0MPf6opJL8o6NKT7CDE9q4Zrt9S0skjQIDAQAB
-----END PUBLIC KEY-----
该商户号私钥(pkcs8格式):
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAPD+malK2W3UJXfX5rO79gRUbLe+kwCskw7VzETXA4Qf/5VWlPxOb16SlflkE4zyInhGwehjUTvXPvebNtZJJpKS+Q/7oWw6hMQ1cIC99DWmV6Orjtz61Tmi5A/4QnYqUm2GRScfrnyILQw9/qikkvyjo0pPsIMT2rhmu31LSySNAgMBAAECgYEAokaubeKq2lu6ByLohCqTFINM2cWH8zJBrAGnFMu74GIzlfnBRMwEDiiiuFX9HDGHqHns5HDMKIFeMxjfKhgD0exp3S06xpSbmkIbvWLM+xBl70/+SLG7wztZ4KtdKu7PR26xJht6zM/KDrovuRzFYNB6ZbyO3My9CJXaZS6GU/kCQQD+/wsf0M7Byp+sPzy3SEn8katFopVOz8oESBBuSNNXl1rgyWfgVXBUKRDAus8oa/Nhx2zWNqpuchrHerPp5McHAkEA8fFyidW4nMkL3x4ULQmbsZBqsNEXoKv3fDDvHWRljX0AElel+XaVuxrtpYiDxwqFSM0s92nCBj2ZXt4O+d2eywJAS5mFzMr1YZMXP9QHxjcSaGUvqBeJuLH2LMrIxEmnDuL6uIY928643NrH8rvvywYmRCkB5YiTgucldVq1mHSRZQJAYny8+WrsqbYVhQ/DesnsfQ2iwLN9AMTAC+gHjlluFXiK7OyM/c3OCcpebwHxUrbvpsEOyvBcMRomMr4GLqSOnQJAcDKoXpkYFGakejn6LQj57EBtMgfVNatTipBnQxPaHMGGO9V9SzedbkgNg0NBSzsNsauKnFOy+yFwFqf6oGHm0A==
该商户号公钥(pkcs8格式):
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDw/pmpStlt1CV31+azu/YEVGy3vpMArJMO1cxE1wOEH/+VVpT8Tm9ekpX5ZBOM8iJ4RsHoY1E71z73mzbWSSaSkvkP+6FsOoTENXCAvfQ1plejq47c+tU5ouQP+EJ2KlJthkUnH658iC0MPf6opJL8o6NKT7CDE9q4Zrt9S0skjQIDAQAB
联调工具
请求IP报备
:::tip[]
当请求连连开放接口时,连连侧会做来源IP的安全校验,判断该IP是否报备过,如果没有报备过,接口同步返回报错:IP未报备,所以需要您提前报备请求连连接口的服务器公网IP(可以报备多个)
PS:如果初始报备IP后,后续有IP新增或移除也是相同流程
:::
发邮件给我们报备来源IP,邮件模板如下
:::highlight blue 📧[申请邮件模板]
邮件主题:新增IP白名单申请-商户名称XXX
发送邮箱:tech_support@lianlianpay.com
邮件内容(示例):
新增IP白名单申请
商户号:2020042200284052
商户名称:测试商户有限公司
IP白名单:111.112.113.114,222.223.224.225
:::
以下是连连接口域名入口IP,如有需要,可以惠存
115.238.30.69,115.238.30.76,183.136.171.33
101.71.136.23,101.71.136.29
112.17.38.119,112.17.38.126
101.37.133.67,203.107.32.166
公私钥生成及配置
:::tip[]
当您的应用和连连做数据交互时,我们使用RSA公私钥加解密的方式作为身份合法性校验的一种方式。 您需要为您的应用生成属于您的公私钥对,其中私钥用于接口请求时加签使用,公钥上传到连连用于验证您系统发起的接口请求的身份合法性。
:::
生成公私钥对时,推荐使用OpenSSL完成。
- OpenSSL官方下载地址:https://www.openssl.org/source
- Openssl-0.9.8k_WIN32RSA密钥生成工具包:https://oss-mpay-static.lianlianpay.com/tps/5292a714-5013-4125-b82e-bd3a9d09057d.rar
执行如下命令,执行成功后,会在目录下生成rsa_private_key.pem文件,该文件为pkcs1格式的私钥(PHP语言使用)
bash openssl genrsa -out rsa_private_key.pem 4096
开发语言是Java或者C#的还需要将私钥格式转为pkcs8
bash openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -out rsa_private_key.txt -nocrypt
执行如下命令,执行成功后,会在目录下生成rsa_public_key.pem文件
bash openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
登录 聚数商户站后台,进入商家中心选择参数配置,把上述步骤中生成的公钥rsa_public_key.pem文件,去除文件中的头部、尾部及换行在此处提交。
连连公钥用于异步通知验签和接口响应验签
text -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCSS/DiwdCf/aZsxxcacDnooGph3d2JOj5GXWi+q3gznZauZjkNP8SKl3J2liP0O6rU/Y/29+IUe+GTMhMOFJuZm1htAtKiu5ekW0GlBMWxf4FPkYlQkPE0FtaoMP3gYfh+OwI+fIRrpW3ySn3mScnc6Z700nU/VYrRkfcSCbSnRwIDAQAB -----END PUBLIC KEY-----
PS:Java或C#开发语言,需对该公钥进行去除头部、尾部及换行的处理后使用;PHP开发语言,可以直接使用
域名报备(可选)
:::tip[]
当您需要使用连连提供的收银台页面时,连连会去校验访问收银台的来源域名
要求:
- 来源域名必须有(没有带上来源域名,页面会报错:未检测到请求来源域名)
- 该来源域名必须是在连连报备过的(没有报备,页面会报错:来源域名未报备)
:::
PS:没有使用连连的收银台页面,可以不需要进行域名报备
需联系连连商务同事走内部流程发起域名报备申请(只能报备二级域名)
线下加款通知地址配置(可选)
有线下加款场景的时候,需要提供线下加款通知地址给技术支持配置在商户号上,邮件模板如下。
加款成功后,会有异步通知到这个地址。
通知信息详情请看 线下加款成功通知
:::highlight blue 📧[申请邮件模板]
邮件主题:商户线下加款异步通知地址配置申请-商户名称XXX
发送邮箱:tech_support@lianlianpay.com
邮件内容(示例):
xxxx商户线下加款异步通知地址配置申请
商户号:2020042200284052
商户名称:测试商户有限公司
线下加款异步通知地址:https://abc.xxxxx.com/
:::
签名机制
为保证您与连连之间消息来往的安全性,防止支付或者通知的数据被伪造,篡改,连连要求对所有来往的信息加入签名机制。
连连目前采用的是 RSA 加密方式中的md5withRSA算法实现的签名机制。
签名内容产生规则:
1. 获取请求完整JSON报文,使用MD5计算出报文摘要值(全小写)
2. 将该MD5计算出的摘要值按照md5withRSA的签名算法,使用您的私钥进行加签
3. 将签名值使用Base64转码得到签名串signature
4. 将签名方式和签名值设置在http header中,并自定义如下对应属性(Signature-Data):
| 自定义Header key | 是否必须 | 描述 |
| --- | --- | --- |
| Signature-Type | 是 | 签名方式:RSA |
| Signature-Data | 是 | 签名值RSA签名,见安全签名机制<br>Signature-Data = Base64(RSA(MD5(完整JSON报文))) |
| mch_id | 可选 | 商户在连连系统中的唯一标识,mch_id和sp_no需传其一即可 |
| sp_no | 可选 | 服务商编号,mch_id和sp_no需传其一即可 |
| timestamp | 是 | 时间戳,格式:yyyyMMddHHmmss,例如20250106145022 |
### **签名生成流程(体验)**
以下签名生成流程使用**测试环境测试商户号**调用 [卡bin查询](https://open.lianlianpay.com/docs/multipayment/bin-query-pure.html) 接口为例,进行演示。
请求json报文:
```json
{"card_no":"9558834301000461394","mch_id":"2020042200284052"}
```
<Steps>
<Step title="生成请求Json报文的MD5摘要值">
使用 [MD5在线生成工具](http://tool.haooyou.com/code?group=hash&type=md5&charset=UTF-8) 生成请求Json报文的MD5摘要值(32位小写)
MD5摘要值为:
```text
51a592df873c64dd2c2c88ce8c365ec7
```
使用 RSA私钥加签在线工具 对步骤1生成的MD5摘要值进行RSA私钥加签(测试商户号私钥)
签名值为:
text q2G8ulbvKZEOkBCeyK8s++rATQfMjvn0JhQGELe7wn8Qih0qmuM3pgjJ9BVDza3qcGcLbKXfUCusBW17fAjyyWz33ucgxyS9VVUrgFsO0acVlrQK7xJpIy0X6Z2jjNvSZhpPxLxktDZyRHA7WGQZFo1SL5HsUMlBIxj69OjAG2c=
请求头headers配置信息:
发起请求:
签名内容产生规则:
1. 连连向您发送的信息,您需要进行验签,确保信息没有被篡改
2. 从请求体中获取连连向您发送的信息完整JSON报文,使用MD5计算出报文摘要值(全小写)
3. 从请求头中获取连连向您发送信息的签名值
4. 使用RSA公钥验签方法对MD5摘要值和签名值进行校验
### **验签流程(体验)**
使用如下内容进行验签过程演示
连连发送的信息完整JSON报文:
```json
{"accountInfo":{"accountLevel":"V3","accountNeedLevel":"V3","accountNeedType":"PERSONAL_PAYMENT_ACCOUNT","accountType":"PERSONAL_PAYMENT_ACCOUNT"},"accp_txno":"20230829000012374866","oid_partner":"2020042200284052","oid_userno":"2023082813762354","txn_seqno":"1696339459111317504","user_id":"741852963","user_status":"NORMAL"}
连连发送信息的签名值: text
Gkb/kkuByKHzsPPmAn89hjvxsyJZN02dUCaa5m0nf9fxdaWDCvo5mZdhYz6XBrDY7dg0kgM/yMyEpalCA+24mIW80OjL+yLTUkJMcGcCaEBDjMyT30KwU2jkbbGUmLMSfTdBUoPFTqeEQRNXibP1c0uszWwuiQToOkiSg0UpvXM=
```
<Steps>
<Step title="生成请求Json报文的MD5摘要值">
使用 [MD5在线生成工具](http://tool.haooyou.com/code?group=hash&type=md5&charset=UTF-8) 生成请求Json报文的MD5摘要值(32位小写)
MD5摘要值为:
```text
dc21d276613d34970c10356adb9a8176
```
使用 RSA私钥加签在线工具 对步骤1生成的MD5摘要值和请求头的签名值进行RSA公钥验签(连连公钥)
点击验签按钮后,签名结果方框中会显示本次验签的结果
### 连连验签公钥
连连公钥用于异步通知验签和接口响应验签
text -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCSS/DiwdCf/aZsxxcacDnooGph3d2JOj5GXWi+q3gznZauZjkNP8SKl3J2liP0O6rU/Y/29+IUe+GTMhMOFJuZm1htAtKiu5ekW0GlBMWxf4FPkYlQkPE0FtaoMP3gYfh+OwI+fIRrpW3ySn3mScnc6Z700nU/VYrRkfcSCbSnRwIDAQAB -----END PUBLIC KEY-----
PS:Java或C#开发语言,需对该公钥进行去除头部、尾部及换行的处理后使用;PHP开发语言,可以直接使用
公钥加密方法
RSA公钥加密
部分字段需要用RSA公钥加密后传输,加密公钥为连连的公钥,加密方法和密钥如下所示:
byte[] keyByte = org.apache.commons.codec.binary.Base64.decodeBase64(public_key);
X509EncodedKeySpec x509ek = new X509EncodedKeySpec(keyByte);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509ek);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] sbt = source.getBytes(StandardCharsets.UTF_8); // //本地测试可以使用这个
byte[] epByte = cipher.doFinal(sbt);
String epStr = org.apache.commons.codec.binary.Base64.encodeBase64String(epByte);
return epStr;
}
</Tab> <Tab title="PHP示例"> php
//RSA公钥加密
public function publicEncrypt($data)
{
$encrypted = '';
$pu_key = openssl_pkey_get_public($this->PubKey);
$plainData = str_split($data, 100);
foreach ($plainData as $chunk) {
$partialEncrypted = '';
$encryptionOk = openssl_public_encrypt($chunk, $partialEncrypted, $pu_key);//公钥加密
if ($encryptionOk === false) {
return false;
}
$encrypted .= $partialEncrypted;
}
$encrypted = base64_encode($encrypted);
return $encrypted;
}
```
异步通知
概述和特征
交易请求和开户请求完成后,连连会把相关结果和信息异步发送给您,您的系统需要接收该通知,并按照约定内容响应。
异步通知是HTTP POST请求
连连下发的异步通知是一个HTTP POST请求,以数据流的形式发送,您的系统需要使用读取字节流的方式进行获取,不同语言的获取形式举例:file_get_contents("php://input"); // php request.getInputStream(); // Java Request.inputStream; // asp异步通知的
Content-type为text/json;charset=utf-8接收异步通知地址要求
- 通知地址公网可访问
- 端口:https协议支持端口443,http协议支持端口80,建议使用https协议
- 对于https地址,您证书必须为认证机构颁发的证书,不可使用非授信组织颁发的测试证书,如不可使用自行颁发的证书
异步通知重发机制
当连连下发异步通知后,贵司系统没有按照约定内容响应,连连异步通知是有重发机制,会进行重复通知,频率为2分钟,共30次,在30次内,按照约定内容响应,就会停止重复通知。连连异步通知下发的服务器IP
以下是连连异步通知下发的服务器IP,建议您加入到服务器的白名单中115.238.30.68,101.71.136.20,112.17.38.116,183.136.171.62,47.97.113.169,47.97.186.139,101.37.146.140,47.97.201.103,47.97.120.214,47.97.175.245
异步通知处理流程
以下是当您的系统成功获取到异步通知后,我们建议的处理步骤
您的系统对于交易结果通知的内容必须要先做签名验证,验签详情请参考 签名机制-验签,并校验返回的交易金额是否与您系统的订单金额一致,防止数据泄漏导致出现假通知,造成资金损失。
当验签通过后,如果您需要使用连连发送的异步通知内容触发后续的业务逻辑处理,我们这边建议您的系统进行异步处理业务逻辑,因为如果您的业务逻辑处理过程耗时高,会存在等待响应超时的情况。
超时判断规则:
- 超过5秒TCP握手没有成功,连连系统认为超时
- TCP握手成功后,超过5秒没有响应,连连系统认为超时
当您的系统首次收到异步通知时,对其做出响应,处理您的业务逻辑并置已处理的标志;之后再次收到的异步通知,均进行响应但不做业务处理。
