1、接入流程
商户⼊驻完成后,开发同学可以进⾏开发联调了。上线前需要完成CAE签约、分佣设置。
1.1 商户入驻
准备以下材料(附件:),填写后发给阿⾥巴巴的产品经理。
注意事项:
- ⽀付宝账号:最好是B类账号,因为⾮B类账号有20万/年的额度限制。
- 淘宝账号:需要⽤上边的⽀付宝账号同时开通的淘宝账号,即⽀付宝账户和淘宝账号要有关联。(因为通过淘宝账号登录账房系统,查看⽀付流⽔数据。)
- 淘宝会员名称:不是昵称,是会员名称。
- ⻔头照:需要带有公司名称的照⽚,⽐如公司前台和建筑物正⻔。
- 营业执照和法⼈身份证照⽚,要求⼩于1MB。
1.2 CAE签约
CAE签约是⽀付宝的⼀项业务,⽤于账期和分佣。⽐如每⽉10⽇进⾏打款,平台抽取佣⾦5%。此项业务签约由阿⾥巴巴的产品经理发起。
1.3 分佣设置
设置平台抽取的佣⾦的⽐例。账期分佣的设置,请找阿⾥巴巴的⾏业运营。(这⼀步在正式上线前配置即可)
1.4 开发设置
找阿⾥巴巴的产品经理获取公钥,⽤于⽀付成功回调信息的验签。(请看下⾯的接⼊⽂档)
2、开发测试
2.1 拉起收银台
apk通过startActivity的⽅式拉起收银台。调⽤参考下⾯代码:
private void qrcode(Activity activity, long sellerId, long amount, String appId, String outItemId,String outItemName, String outOrderId,long payExpireTime, String sign){
if(activity == null || sellerId <=0 || TextUtils.isEmpty(outOrderId) || !Utils.isFastClick()){
return;
}
JSONObject dataObject = new JSONObject();
dataObject.put("sellerId", sellerId);
JSONObject contentObject = new JSONObject();
contentObject.put("amount", amount);
contentObject.put("appId", appId);
contentObject.put("outItemId", outItemId);
contentObject.put("outItemName", outItemName);
contentObject.put("outOrderId", outOrderId);
contentObject.put("payExpireTime", payExpireTime);
contentObject.put("sellerId", sellerId);
String contentSource = contentObject.toJSONString();
dataObject.put("content", contentSource);
dataObject.put("sign", sign);
Intent intent = new Intent("android.intent.action.VIEW",
Uri.parse("genie://com.alibaba.ailabs.genie.commonpay/qrcode"));
intent.putExtra("data", dataObject.toJSONString());
activity.startActivityForResult(intent, 1234);
}
//@Override
private void onActivityResult(int requestCode, int resultCode, Intent data){
if(requestCode == 1234 && resultCode == Activity.RESULT_OK){
if(data != null){
boolean isPaySuccess = data.getBooleanExtra("isPaySuccess",false);
String paySuccessDataJson = data.getStringExtra("paySuccessData");
int payErrorCode = data.getIntExtra("payErrorCode", -1);
String payErrorMsg = data.getStringExtra("payErrorMsg");
Log.e(TAG, "qrcode, isPaySuccess="+isPaySuccess+
";paySuccessDataJson="+paySuccessDataJson+
";payErrorCode="+payErrorCode+
";payErrorMsg="+payErrorMsg);
}
}
}
2.2 参数说明
qrcode方法参数说明:
属性 | 类型 | 必填 | 说明 |
---|---|---|---|
sellerId | Number | 是 | 商户的淘宝id |
content | String | 是 | ⽀付内容(内容的字段说明下表说明) |
sign | String | 是 | 对content 内容签名,商户的RSA私钥对内容 的签名;平台会⽤商户 上传的公钥验签。 |
- content(⽀付内容)字段说明: | 属性 | 类型 | 必填 | 说明 | | —- | —- | —- | —- | | amount | Number | 是 | 订单⾦额 (单位:分) | | appId | String | 是 | ⼩程序appid | | outItemId | String | 是 | 商户商品id | | outItemName | String | 是 | 商户售卖的产品名称 | | outOrderId | String | 是 | 商户订单号 | | payExpireTime | String | 是 | 订单的超时时间(默认15分钟) | | sellerId | Number | 是 | 商户的淘宝id |
- 秘钥说明: | 参数名 | 获取方式 | | —- | —- | | RSA私钥 | 商户⾃我管理 | | RSA公钥 | 商户⼊驻时,在开发设置⾥提供,必填 |
- sign加签说明(服务端):
```java
通过⽀付宝SDK提供的⼯具类进⾏加签验签操作。 可以在maven中央仓库下载到,版本选择 3.7.80.ALL 以上即可
https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java
alipay-sdk-java alipay-sdk-java 3.7.80.ALL
content: 需要加签的业务参数,json字符串
加签: String sign = AlipaySignature.rsaSign(content, sysPriKey, “UTF-8”, “RSA”);
验签: boolean signCheck = AlipaySignature.rsaCheck(content, sign2, sysPubKey, “UTF-8”, “RSA”);
常⻅的下单后⽆法唤起收银台的问题:
1. content的内容是json字符串, 但是被⼆次转义处理了,导致天猫精灵测验签失败。
```json
正例:
"{\"amount\":19801,\"appId\":\"2021001140639410\",\"outItemId\":\"1000001\",
\"outItemName\":\"VIP会员\",\"outOrderId\":\"102247420200401104523\",
\"payExpireTime\":1585709123000,\"sellerId\":22070615698}"
反例:
\"{\\\"amount\\\":19801,\\\"appId\\\":\\\"2021001140639410\\\",
\\\"outItemId\\\":\\\"1000001\\\",\\\"outItemName\\\":\\\"VIP会员\\\",
\\\"outOrderId\\\":\\\"1021456202031172814\\\",\\\"payExpireTime\\\":1585646894000,
\\\"sellerId\\\":2207615698}\"
商品⾦额的单位是 分,切记!!!
content⾥⾯部分字段含有特殊的转义字符,例如: “outItemName\”:\”VIP\u4f1a\u5458\”
content字符串顺序发⽣变更,加密的字符串顺序和传给天猫精灵的字符串顺序不⼀致。
创建订单:
⽀付宝⽀付:
3、服务端HTTP支付结果回调
按照天猫精灵的协议规范,提供http请求地址给天猫精灵侧进⾏配置。支付结果回调数据是放进Request body⾥的,开发者从body⾥获取内容。
先按照协议规范进⾏⾃测,通过post请求,确认⾃⼰的接⼝是否可以接收到回调的数据。⽬前经常发现开发者提供的接⼝400错误、500错误。所以先⾃测。
回调接⼝是天猫精灵作为发起⽅,客户⽅作为提供⽅:
说明 | 测试环境 | 生产环境 | 产生方式 |
---|---|---|---|
请求方式 | POST | POST | http协议⾃带 |
RSA公钥 | 见下文 | 见下文 | 由天猫精灵提供给客户⽅,⽤于通知结果验签。 |
- 业务请求参数:
| 参数名 | 中文名 | 字段类型 | 产生方式 | 是否必传 |
| —- | —- | —- | —- | —- |
| content | 业务参数 | String | 将业务参数转成json字符串得到 | 是 |
| sign | 签名 | String | 将业务参数转成json字符串,使⽤
RSA私钥加密得到 | 是 |
- 业务参数: | 参数名 | 中文名 | 字段类型 | 是否必传 | | —- | —- | —- | —- | | sellerId | 卖家id | Long | 是 | | appId | 商户⼊驻时分配的appId | String | 是 | | outOrderId | 商户的订单id | String | 是 | | orderId | 天猫精灵订单ID | String | 是 |
- 响应参数
⽆,当前认为 httpstatus = 200 表示通知成功。
- 加签验签说明
```java
通过⽀付宝SDK提供的⼯具类进⾏加签验签操作。 可以在maven中央仓库下载到,版本选择 3.7.80.ALL 以上即可
https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java
alipay-sdk-java alipay-sdk-java 3.7.80.ALL
content: 需要加签的业务参数,json字符串
加签: String sign = AlipaySignature.rsaSign(content, sysPriKey, “UTF-8”, “RSA”);
验签: boolean signCheck = AlipaySignature.rsaCheck(content, sign2, sysPubKey, “UTF-8”, “RSA”);
<a name="L4GEC"></a>
# 4、支付结果回调加密公钥
<a name="T7jVe"></a>
## 4.1 预发环境公钥(用于联调):
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1MI9xUzoikoZGpMkI3ymDNh/jg0hXAQyLhIZFCXo2R43BCXjR4iGgYMMZlnvYiblU8Oo8t+ojq5tYgVHHQNda/KDW1mLQuzA/pZGVDrk14LjEl3Fd6+FlOxDnl+oP25ZooqSdx7MpC7CN0TL7pi6KSm3e0blMScCA1uXD0/GSMq+J+eNdk3fBcQ2AVGeKCUaIzdLjiRVuOqHgnH4k6lK1g5wgovVNdg2fiAjqBX2NdmswsIwZpReHHnb0B7LlgYeHD1/oWpJ2JaZFBrS3iI3Kg1NSsVDzKn50VNe7r18DwaGt6GzCjNARnU3wgaLCOL9us674D10QnmdrcbH+5iObQIDAQAB
<a name="lxwag"></a>
## 4.2 线上环境公钥
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuaZuqK6IjNO/Ji8hWvUubD+Rx1ty1AKzZYN/5jpcgcknAS5jiCHyYd1Y6jyk+9yJEmCB3l32VbDtYquIxuFImKPFlt+dv0c+3f0ABZTWbwO3Pw1szMKZEw232D/DPswzhHh7ROwdiqevCY6wWbpd/IxqKQ1eDPkAMwRgB9beiOnXHeH78CuxonAJpk5rGHi8I1mLsSjZHyEJhvIJ93bwkXb/l6sAtbNYwJPaKoc+1u6uRWn9PdOjc5Wk+OE8J95yh6zLh8sEoyYXFq3IC2S0wZuh01OMJLdIO3nhIeq4VLeXiDISPobOgd6+losHjWCxap5qgxLe/+fJdiFq2hfOwwIDAQAB ```
5、常见问题(Q&A)
5.1 提供的入驻资料,对应字段解释具体含义?
字段解释可参考 ⽀付宝开放⽂档 中商户创建中对于字段解释。
5.2 验证签名失败
下单接⼝,需要对数据加签。按照⽂档的⽅式先⾃我测试⼀遍。
5.3 ⾦额异常
订单最低⾦额是1分。amount 是 long型,不要传⼩数。
5.4 密钥如何获取?
RSA密钥⽣成器⽣成。
5.5 appid和sellerid分别怎么获取?
- appid:是商户的应⽤id,⽐如⼀个游戏公司旗下可能会有多款游戏,那么每个游戏都会有⼀个appid。这个
appid⽤来区分商户的应⽤,由商户提供。
- sellerid: 商户⼊驻的淘宝id,联系天猫精灵获取。
5.6 密钥分几块?
⽤户下单, 需要商户对下单的数据进⾏加签。 这个地⽅商户⽣成RSA公私钥,商户通过私钥进⾏加签, 天猫精灵通过商户提供的公钥进⾏验签。
⽀付成功通知商户, 这个地⽅天猫精灵⽣成RSA公私钥,天猫精灵通过私钥进⾏加签, 商户通过天猫精灵提供的公钥进⾏验签。