1、接入流程

image.png

商户⼊驻完成后,开发同学可以进⾏开发联调了。上线前需要完成CAE签约、分佣设置。

1.1 商户入驻

image.png
准备以下材料(附件:),填写后发给阿⾥巴巴的产品经理。
注意事项:

  • ⽀付宝账号:最好是B类账号,因为⾮B类账号有20万/年的额度限制。
  • 淘宝账号:需要⽤上边的⽀付宝账号同时开通的淘宝账号,即⽀付宝账户和淘宝账号要有关联。(因为通过淘宝账号登录账房系统,查看⽀付流⽔数据。)
  • 淘宝会员名称:不是昵称,是会员名称。
  • ⻔头照:需要带有公司名称的照⽚,⽐如公司前台和建筑物正⻔。
  • 营业执照和法⼈身份证照⽚,要求⼩于1MB。

1.2 CAE签约

CAE签约是⽀付宝的⼀项业务,⽤于账期和分佣。⽐如每⽉10⽇进⾏打款,平台抽取佣⾦5%。此项业务签约由阿⾥巴巴的产品经理发起。

1.3 分佣设置

设置平台抽取的佣⾦的⽐例。账期分佣的设置,请找阿⾥巴巴的⾏业运营。(这⼀步在正式上线前配置即可)

1.4 开发设置

找阿⾥巴巴的产品经理获取公钥,⽤于⽀付成功回调信息的验签。(请看下⾯的接⼊⽂档)

2、开发测试

2.1 拉起收银台

apk通过startActivity的⽅式拉起收银台。调⽤参考下⾯代码:

  1. private void qrcode(Activity activity, long sellerId, long amount, String appId, String outItemId,String outItemName, String outOrderId,long payExpireTime, String sign){
  2. if(activity == null || sellerId <=0 || TextUtils.isEmpty(outOrderId) || !Utils.isFastClick()){
  3. return;
  4. }
  5. JSONObject dataObject = new JSONObject();
  6. dataObject.put("sellerId", sellerId);
  7. JSONObject contentObject = new JSONObject();
  8. contentObject.put("amount", amount);
  9. contentObject.put("appId", appId);
  10. contentObject.put("outItemId", outItemId);
  11. contentObject.put("outItemName", outItemName);
  12. contentObject.put("outOrderId", outOrderId);
  13. contentObject.put("payExpireTime", payExpireTime);
  14. contentObject.put("sellerId", sellerId);
  15. String contentSource = contentObject.toJSONString();
  16. dataObject.put("content", contentSource);
  17. dataObject.put("sign", sign);
  18. Intent intent = new Intent("android.intent.action.VIEW",
  19. Uri.parse("genie://com.alibaba.ailabs.genie.commonpay/qrcode"));
  20. intent.putExtra("data", dataObject.toJSONString());
  21. activity.startActivityForResult(intent, 1234);
  22. }
  23. //@Override
  24. private void onActivityResult(int requestCode, int resultCode, Intent data){
  25. if(requestCode == 1234 && resultCode == Activity.RESULT_OK){
  26. if(data != null){
  27. boolean isPaySuccess = data.getBooleanExtra("isPaySuccess",false);
  28. String paySuccessDataJson = data.getStringExtra("paySuccessData");
  29. int payErrorCode = data.getIntExtra("payErrorCode", -1);
  30. String payErrorMsg = data.getStringExtra("payErrorMsg");
  31. Log.e(TAG, "qrcode, isPaySuccess="+isPaySuccess+
  32. ";paySuccessDataJson="+paySuccessDataJson+
  33. ";payErrorCode="+payErrorCode+
  34. ";payErrorMsg="+payErrorMsg);
  35. }
  36. }
  37. }

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公钥 | 商户⼊驻时,在开发设置⾥提供,必填 |

content: 需要加签的业务参数,json字符串

加签: String sign = AlipaySignature.rsaSign(content, sysPriKey, “UTF-8”, “RSA”);

验签: boolean signCheck = AlipaySignature.rsaCheck(content, sign2, sysPubKey, “UTF-8”, “RSA”);

  1. 常⻅的下单后⽆法唤起收银台的问题:
  2. 1. content的内容是json字符串, 但是被⼆次转义处理了,导致天猫精灵测验签失败。
  3. ```json
  4. 正例:
  5. "{\"amount\":19801,\"appId\":\"2021001140639410\",\"outItemId\":\"1000001\",
  6. \"outItemName\":\"VIP会员\",\"outOrderId\":\"102247420200401104523\",
  7. \"payExpireTime\":1585709123000,\"sellerId\":22070615698}"
  8. 反例:
  9. \"{\\\"amount\\\":19801,\\\"appId\\\":\\\"2021001140639410\\\",
  10. \\\"outItemId\\\":\\\"1000001\\\",\\\"outItemName\\\":\\\"VIP会员\\\",
  11. \\\"outOrderId\\\":\\\"1021456202031172814\\\",\\\"payExpireTime\\\":1585646894000,
  12. \\\"sellerId\\\":2207615698}\"
  1. 商品⾦额的单位是 ,切记!!!

  2. content⾥⾯部分字段含有特殊的转义字符,例如: “outItemName\”:\”VIP\u4f1a\u5458\”

  3. content字符串顺序发⽣变更,加密的字符串顺序和传给天猫精灵的字符串顺序不⼀致。

创建订单:
image.png

⽀付宝⽀付:
image.png

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 表示通知成功。

content: 需要加签的业务参数,json字符串

加签: String sign = AlipaySignature.rsaSign(content, sysPriKey, “UTF-8”, “RSA”);

验签: boolean signCheck = AlipaySignature.rsaCheck(content, sign2, sysPubKey, “UTF-8”, “RSA”);

  1. <a name="L4GEC"></a>
  2. # 4、支付结果回调加密公钥
  3. <a name="T7jVe"></a>
  4. ## 4.1 预发环境公钥(用于联调):

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1MI9xUzoikoZGpMkI3ymDNh/jg0hXAQyLhIZFCXo2R43BCXjR4iGgYMMZlnvYiblU8Oo8t+ojq5tYgVHHQNda/KDW1mLQuzA/pZGVDrk14LjEl3Fd6+FlOxDnl+oP25ZooqSdx7MpC7CN0TL7pi6KSm3e0blMScCA1uXD0/GSMq+J+eNdk3fBcQ2AVGeKCUaIzdLjiRVuOqHgnH4k6lK1g5wgovVNdg2fiAjqBX2NdmswsIwZpReHHnb0B7LlgYeHD1/oWpJ2JaZFBrS3iI3Kg1NSsVDzKn50VNe7r18DwaGt6GzCjNARnU3wgaLCOL9us674D10QnmdrcbH+5iObQIDAQAB

  1. <a name="lxwag"></a>
  2. ## 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 密钥分几块?

  1. ⽤户下单, 需要商户对下单的数据进⾏加签。 这个地⽅商户⽣成RSA公私钥,商户通过私钥进⾏加签, 天猫精灵通过商户提供的公钥进⾏验签。

  2. ⽀付成功通知商户, 这个地⽅天猫精灵⽣成RSA公私钥,天猫精灵通过私钥进⾏加签, 商户通过天猫精灵提供的公钥进⾏验签。