插件后端开发
背景
插件是一个不能独立运行的小程序,必须依附在其他的小程序上,且目前插件小程序是一个三方应用,当插件需要获取商户拥有的支付宝能力的时候,必须代商户调用支付宝接口,所以插件服务端最重要的概念就是代调用。
服务端开发准备
插件服务端开发需要下载支付宝服务端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时候,必须保证‘应用网关’、‘授权回调地址’必须配置完成。
在保证应用网关、授权回调地址配置完成后,增加或删除应用功能包,都会推送最新的app_auth_token给插件服务端,采用在这种方式就可以验证模拟商户订购插件回调app_auth_token的过程。
获得 access_token
开发联调时,插件真机预览,用户授权,获取用户的access_token时候,app_auth_token 是插件的调试容器的授权token(自动授权的),位置见下图:
代码demo:
//三方应用开发者私钥,由开发者自己生成 参考 https://docs.open.alipay.com/200/105310#s2
String appPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCKnImlg1tZYi4UBFwk3A4L3LjuAy";
//支付宝公钥,由支付宝生成
String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4r6vW";
String format = "json";
String charset = "UTF-8";
String signType = "RSA2"; //商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
String serverUrl = "https://openapi.alipay.com/gateway.do";
String appId = "2018071660683196"; //三方应用id 保证应用已经上线了
String appAuthToken = "1cc19911172e4f8aaa509c8fb5d12F56"; //商户授权token https://docs.open.alipay.com/20160728150111277227/intro
String authCode = "bc95009acbe1401cabec35cece99SC12"; // 用户授权码
AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, appId, appPrivateKey, format, charset, alipayPublicKey, signType);
try {
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setGrantType("authorization_code");
request.setCode(authCode);
AlipaySystemOauthTokenResponse response = alipayClient.execute(request, null, appAuthToken);
System.out.println(response.getAccessToken());
} catch (AlipayApiException e) {
e.printStackTrace();
}
详情请参考API参考文档。
代调用获取用户信息
简单说代调用获取用户信息,是利用app_id(三方应用id) + app_auth_token+access_token 调用接口获取用户信息。
//三方应用开发者私钥,由开发者自己生成 参考 https://docs.open.alipay.com/200/105310#s2
String appPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCKnImlg1tZYi4UBFwk3A4L3LjuAy";
//支付宝公钥,由支付宝生成
String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4r6vW";
String format = "json";
String charset = "UTF-8";
String signType = "RSA2"; //商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2
String serverUrl = "https://openapi.alipay.com/gateway.do";
String appId = "2018071660683196"; //三方应用id 保证应用已经上线了
String appAuthToken = "1cc19911172e4f8aaa509c8fb5d12F56"; //商户授权token https://docs.open.alipay.com/20160728150111277227/intro
String accessToken = "22c19911172e4f8aaa509c8fb5d12F56"; //用户授权token
AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, appId, appPrivateKey, format, charset, alipayPublicKey, signType);
try {
AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest();
AlipayUserInfoShareResponse response = alipayClient.execute(request, accessToken, appAuthToken);
response.getUserId();
response.getUserName();
} catch (AlipayApiException e) {
e.printStackTrace();
}
详情请参考API参考文档。
插件如何区分门店助手和小程序用户来源
商家通过门店助手小程序对门店插件进行管理,那么有两类用户,一类是门店管理员,从门店助手小程序跳往插件;另外一类是门店用户,直接从门店跳往插件。如何区分这两种场景和用户呢?以下为代码范例:
{
"containerPage": "pages/plugin-test/index",
"params": {
"alipay.store.info.allowPay": false,
"alipay.store.info.name": "门店插件调试容器",
"alipay.store.info.category": "2222222",
"alipay.store.info.phone": "951828",
"alipay.store.info.desc": "模拟门店的运行环境,让开发者可以直观看到插件在门店上的运行效果",
"alipay.store.info.descBrief": "用于调试门店插件的容器",
"alipay.store.info.address": {
"detailAddress": "浙江省杭州市西湖区西溪路552-1号",
"poi": "蚂蚁z空间"
},
"plugin.common.mode": "admin" // 门店助手这个地方是admin,其他来源无
}
}