插件后端开发

背景

插件是一个不能独立运行的小程序,必须依附在其他的小程序上,且目前插件小程序是一个三方应用,当插件需要获取商户拥有的支付宝能力的时候,必须代商户调用支付宝接口,所以插件服务端最重要的概念就是代调用。

image.png

服务端开发准备

插件服务端开发需要下载支付宝服务端SDK

插件代调用

  • 插件代替商家来调用支付宝能力时候,需要获得商家授权发送app_auth_code 换取 app_auth_token。
  • 商家授权是授权商家下面某一个应用给插件代调用,所以插件服务端需要建立 PID - auth_app_id - app_auth_token 三者唯一关系。
  • 当插件代理商家获取用户信息时候,需要用户授权发送auth_code 插件代理换取access_token,最终用 app_id(三方应用id) + app_auth_token + access_token 请求接口获得用户信息。

获得app_auth_token

当商家订购插件时候,会授权给三方应用代调用权限,app_auth_token回调发送给插件网关,所以在联调获取app_auth_token时候,必须保证‘应用网关’、‘授权回调地址’必须配置完成。

image.png

在保证应用网关、授权回调地址配置完成后,增加或删除应用功能包,都会推送最新的app_auth_token给插件服务端,采用在这种方式就可以验证模拟商户订购插件回调app_auth_token的过程。

image.png

获得 access_token

开发联调时,插件真机预览,用户授权,获取用户的access_token时候,app_auth_token 是插件的调试容器的授权token(自动授权的),位置见下图:

image.png

代码demo:

  1. //三方应用开发者私钥,由开发者自己生成 参考 https://docs.open.alipay.com/200/105310#s2
  2. String appPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCKnImlg1tZYi4UBFwk3A4L3LjuAy";
  3. //支付宝公钥,由支付宝生成
  4. String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4r6vW";
  5. String format = "json";
  6. String charset = "UTF-8";
  7. String signType = "RSA2"; //商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
  8. String serverUrl = "https://openapi.alipay.com/gateway.do";
  9. String appId = "2018071660683196"; //三方应用id 保证应用已经上线了
  10. String appAuthToken = "1cc19911172e4f8aaa509c8fb5d12F56"; //商户授权token https://docs.open.alipay.com/20160728150111277227/intro
  11. String authCode = "bc95009acbe1401cabec35cece99SC12"; // 用户授权码
  12. AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, appId, appPrivateKey, format, charset, alipayPublicKey, signType);
  13. try {
  14. AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
  15. request.setGrantType("authorization_code");
  16. request.setCode(authCode);
  17. AlipaySystemOauthTokenResponse response = alipayClient.execute(request, null, appAuthToken);
  18. System.out.println(response.getAccessToken());
  19. } catch (AlipayApiException e) {
  20. e.printStackTrace();
  21. }

详情请参考API参考文档

代调用获取用户信息

简单说代调用获取用户信息,是利用app_id(三方应用id) + app_auth_token+access_token 调用接口获取用户信息。

  1. //三方应用开发者私钥,由开发者自己生成 参考 https://docs.open.alipay.com/200/105310#s2
  2. String appPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCKnImlg1tZYi4UBFwk3A4L3LjuAy";
  3. //支付宝公钥,由支付宝生成
  4. String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4r6vW";
  5. String format = "json";
  6. String charset = "UTF-8";
  7. String signType = "RSA2"; //商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
  8. String serverUrl = "https://openapi.alipay.com/gateway.do";
  9. String appId = "2018071660683196"; //三方应用id 保证应用已经上线了
  10. String appAuthToken = "1cc19911172e4f8aaa509c8fb5d12F56"; //商户授权token https://docs.open.alipay.com/20160728150111277227/intro
  11. String accessToken = "22c19911172e4f8aaa509c8fb5d12F56"; //用户授权token
  12. AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, appId, appPrivateKey, format, charset, alipayPublicKey, signType);
  13. try {
  14. AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest();
  15. AlipayUserInfoShareResponse response = alipayClient.execute(request, accessToken, appAuthToken);
  16. response.getUserId();
  17. response.getUserName();
  18. } catch (AlipayApiException e) {
  19. e.printStackTrace();
  20. }

详情请参考API参考文档

插件如何区分门店助手和小程序用户来源

商家通过门店助手小程序对门店插件进行管理,那么有两类用户,一类是门店管理员,从门店助手小程序跳往插件;另外一类是门店用户,直接从门店跳往插件。如何区分这两种场景和用户呢?以下为代码范例:

  1. {
  2. "containerPage": "pages/plugin-test/index",
  3. "params": {
  4. "alipay.store.info.allowPay": false,
  5. "alipay.store.info.name": "门店插件调试容器",
  6. "alipay.store.info.category": "2222222",
  7. "alipay.store.info.phone": "951828",
  8. "alipay.store.info.desc": "模拟门店的运行环境,让开发者可以直观看到插件在门店上的运行效果",
  9. "alipay.store.info.descBrief": "用于调试门店插件的容器",
  10. "alipay.store.info.address": {
  11. "detailAddress": "浙江省杭州市西湖区西溪路552-1号",
  12. "poi": "蚂蚁z空间"
  13. },
  14. "plugin.common.mode": "admin" // 门店助手这个地方是admin,其他来源无
  15. }
  16. }