前言:
当前很多APP中的登录界面都提供了通过第三方账号来进行快捷登录,例如我接下来要说的支付宝,其他的还有微信。QQ等等,至于做法都是大同小异,你只要熟读文档的话,就问题不大!可能有些人觉得很繁琐不想读,所以,这篇文章将会以极其简练的文字来帮你快速解决集成支付宝快捷登录,这里我默认你已经集成好了Alipay的sdk! 什么,没有!看这边传送门
一.获取授权请求参数
首先我们看到这是官方文档的一张截图,一眼看过去你会很迷糊,只知道方法名为authV2然后要传入String类型参数,而这个String呢就是授权请求参数,这个请求参数呢,在项目中呢推荐是要后台拼接好返回给你,这样是为了安全起见!具体有如下:
这里面大都是固定值,只有app_id,pid,target_id等需要获取,另外这里值得注意的是还有一个最重要的参数sign,即以上这些参数通过key=value&的方式拼接好在使用指定的签名方式签名(sign_type)而得到,最后全部拼接好后在传入authV2方法中进行授权操作,其实这些呢都不需要我们前端来做,因为我们只需要通过向后台请求获取就行,说这么多只是为了怕后台小哥哥问你该怎么做,这个时候你就把这些告诉他就行,是不是美滋滋!
二.进行授权操作
既然上面已经拿到了授权参数,那么接下来就是最核心的授权请求了,这里官方文档呢,没有直接告诉你,在它的demo是有写的。这里我直接贴代码
Runnable authRunnable = new Runnable() {
@Override
public void run() {
// 构造AuthTask 对象
AuthTask authTask = new AuthTask(PayDemoActivity.this);
// 调用授权接口,获取授权结果
Map<String, String> result = authTask.authV2(authInfo, true);
Message msg = new Message();
msg.what = SDK_AUTH_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必须异步调用
Thread authThread = new Thread(authRunnable);
authThread.start();
接下来看看消息处理部分
case SDK_AUTH_FLAG: {
@SuppressWarnings("unchecked")
AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);
String resultStatus = authResult.getResultStatus();
// 判断resultStatus 为“9000”且result_code
// 为“200”则代表授权成功,具体状态码代表含义可参考授权接口文档
if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
// 获取alipay_open_id,调支付时作为参数extern_token 的value
// 传入,则支付账户为该授权账户
Toast.makeText(PayDemoActivity.this,
"授权成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT)
.show();
} else {
// 其他状态值则为授权失败
Toast.makeText(PayDemoActivity.this,
"授权失败" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show();
}
break;
}
这里我顺便给大家贴上它这个结果处理的bean类,完全可以直接用
public class AuthResult { private String resultStatus; private String result; private String memo; private String resultCode; private String authCode; private String alipayOpenId; public AuthResult(Map<String, String> rawResult, boolean removeBrackets) { if (rawResult == null) { return; } for (String key : rawResult.keySet()) { if (TextUtils.equals(key, "resultStatus")) { resultStatus = rawResult.get(key); } else if (TextUtils.equals(key, "result")) { result = rawResult.get(key); } else if (TextUtils.equals(key, "memo")) { memo = rawResult.get(key); } } String[] resultValue = result.split("&"); for (String value : resultValue) { if (value.startsWith("alipay_open_id")) { alipayOpenId = removeBrackets(getValue("alipay_open_id=", value), removeBrackets); continue; } if (value.startsWith("auth_code")) { authCode = removeBrackets(getValue("auth_code=", value), removeBrackets); continue; } if (value.startsWith("result_code")) { resultCode = removeBrackets(getValue("result_code=", value), removeBrackets); continue; } } } private String removeBrackets(String str, boolean remove) { if (remove) { if (!TextUtils.isEmpty(str)) { if (str.startsWith("\"")) { str = str.replaceFirst("\"", ""); } if (str.endsWith("\"")) { str = str.substring(0, str.length() - 1); } } } return str; } @Override public String toString() { return "resultStatus={" + resultStatus + "};memo={" + memo + "};result={" + result + "}"; } private String getValue(String header, String data) { return data.substring(header.length(), data.length()); } /** * @return the resultStatus */ public String getResultStatus() { return resultStatus; } /** * @return the memo */ public String getMemo() { return memo; } /** * @return the result */ public String getResult() { return result; } /** * @return the resultCode */ public String getResultCode() { return resultCode; } /** * @return the authCode */ public String getAuthCode() { return authCode; } /** * @return the alipayOpenId */ public String getAlipayOpenId() { return alipayOpenId; } }
好了,当你授权成功后就可以拿到authcode,随后你可以拿它去获取accesstoken,进而获取用户信息,这些操作的话,后台都会给你提供接口的,以上就是支付宝授权登录全部内容了,是不是很简单呢!