1.支付寶授權登錄,獲取用戶信息:
那些導入SDK和配置設置的就不一一講了,參照官方文檔配置即可參照這裏,下面主要說關鍵的代碼處理。
1.首先要讓後臺服務端將拼接好的infoStr信息,通過接口方式獲取得到,這個後端處理。不能放在前段不安全。
2.用得到的infoStr信息調用支付寶SDK授權獲取AuthCode。
3.用得到的AuthCode去獲取用戶信息。
以下是關鍵代碼:
//獲取AuthCode
private void getAlipayUserData() {
if (Constant.ALIPAY_ID.equals("")) {
toast("支付寶sdk未初始化完成,請稍後再試");
} else {
getAuthInfo(authInfo);
}
}
private void getAuthInfo(String alipay_auth_info) {
Runnable authRunnable = new Runnable() {
@Override
public void run() {
// 構造AuthTask 對象
AuthTask authTask = new AuthTask(ImpowerActivity.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();
}
//調用支付寶SDK獲取authcode;
@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
@SuppressWarnings("unused")
public void handleMessage(Message msg) {
switch (msg.what) {
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")) {
toast("授權成功");
// 獲取alipay_open_id,調支付時作爲參數extern_token 的value, 傳入,則支付賬戶爲該授權賬戶
//開發者自己的方法,把code傳給後臺同事,他們拿code換token,這裏是後臺自己去獲取用戶信息
auth_code = authResult.getAuthCode();
if (auth_code != null) {
getAlipayBinDingInfo();
}
} else {
// 其他狀態值則爲授權失敗
if (TextUtils.isEmpty(authResult.getAuthCode())) {
toast("授權取消");
} else {
toast(String.format("授權失敗_authCode:%s", authResult.getAuthCode()));
}
}
break;
}
default:
break;
}
}
};
public static 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;
}
}