由于公司的业务关系,我们开通了支付宝的支付功能,但是在使用中会产生提现.
由于是半路接手这个项目,之前的做法已经集成了微信 自动绑定了微信,但是支付宝却还是需要用户自己输入账号,用户体验不佳,经过查找支付宝的相关接口,发现可以通过第三方授权方式来完成支付宝账户的绑定.
下面记录一下整个的过程.由于此部分都在服务端操作,顾对已客户端的操作不做具体阐述.
接入过程共调用支付宝以下接口
alipay.open.auth.sdk.code.get
alipay.system.oauth.token
alipay.user.userinfo.share
1. 服务器端完成接口信息的签名,将字符串返回给客户端,客户端通过对应的sdk与支付宝进行交互
SortedMap<String,String > map = new TreeMap<>();
map.put("apiname","com.alipay.account.auth");
map.put("method","alipay.open.auth.sdk.code.get");
map.put("app_id", 支付宝分配给开发者的应用ID);
map.put("app_name","mc");
map.put("biz_type","openservice");
map.put("pid",签约的支付宝账号对应的支付宝唯一用户号,以2088开头的16位纯数字组成);
map.put("product_id","APP_FAST_LOGIN");
map.put("scope","kuaijie");
map.put("target_id",商户标识该次用户授权请求的ID,该值在商户端应保持唯一);
map.put("auth_type","AUTHACCOUNT");
map.put("sign_type","RSA");
String signStr = AlipaySignature.getSignContent(map);
String sign = AlipaySignature.rsaSign(signStr, 私钥, 编码);
System.out.println(getEncodeSignContent(map) + "&sign=" + URLEncoder.encode(sign, 编码));
其中的 getEncodeSign方法是将map转为string 并且进行 urlEncode
将最后获取的内容返回给客户端与支付宝进行交互获得如下内容:
result= "success=true&auth_code=xxxxxxxx&result_code=200&alipay_open_id=xxxxxx&user_id=xxxxxx";
至此,第一步完成.
2.通过刚刚获取的auth_code与支付宝交换accesstoken
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID,自己设置的私钥,"json","GBK",支付宝公钥,"RSA");
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();//创建API对应的request类
request.setGrantType("authorization_code");
request.setCode(刚刚获取的auth_code);
AlipaySystemOauthTokenResponse response = alipayClient.execute(request);//通过alipayClient调用API,获得对应的response类
System.out.print(response.getBody());
运行后获得以下内容:
{"alipay_system_oauth_token_response":{"access_token":"kuaijiexxxxx","alipay_user_id":"xxxxxxxx","expires_in":1209600,"re_expires_in":15552000,"refresh_token":"xxxxxxxx","user_id":"2088702643630845"},"sign":"xxxx"}
至此,我们获得了对应的accesstoken,下面进行第三布获取用户的个人信息
3.根据accesstoken获取用户信息
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", AlipayConfig.APP_ID,私钥, "json", "UTF-8", 支付宝公钥, "RSA"); //获得初始化的AlipayClient
AlipayUserUserinfoShareRequest request = new AlipayUserUserinfoShareRequest();//创建API对应的request类
AlipayUserUserinfoShareResponse response = alipayClient.execute(request, "xxxxxxx");//在请求方法中传入上一步获得的access_token
System.out.print(response.getBody());
运行后获得以下内容
{
"alipay_user_userinfo_share_response": {
"user_type_value": "2",
"is_licence_auth": "F",
"is_certified": "T",
"is_certify_grade_a": "T",
"avatar": "https://b0XXXXXXXXX",
"city": "泰州市",
"is_student_certified": "F",
"area": "海陵区",
"is_bank_auth": "T",
"is_mobile_auth": "T",
"nick_name": "清清",
"alipay_user_id": "xxxxx",
"user_id": "xxxxx",
"province": "江苏省",
"user_status": "T",
"gender": "m",
"is_id_auth": "T"
},
"sign": "xxxx8MdeFrr20ymvwtnMUPaPAw7JSy8J383LT9FxP5DBEIdh9GKh1GPZ1E="
}
此处有个问题,对于页面文档中的字段会有很多,但是此处获取的信息会少很多,具体的在等待支付宝的回复.
注:
其中用的都是RSA加密,由于在支付宝后台没有设置RSA2的秘钥,如果使用RSA2请先配置RSA2的秘钥信息.