在支付寶授權登錄之前,有的需要先判斷一下手機上是否安裝支付寶應用,
public static boolean checkAliPayInstalled(Context context) {
Uri uri = Uri.parse("alipays://platformapi/startApp");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
ComponentName componentName = intent.resolveActivity(context.getPackageManager());
return componentName != null;
}
在APP申請審核之后會自動生成app_id,pid,
RSA_PRIVATE 為公鑰,RSA2_PRIVATE為私鑰
/**
* 用于支付寶支付業(yè)務的入?yún)?app_id。
*/
public static final String APPID = "";
/**
* 用于支付寶賬戶登錄授權業(yè)務的入?yún)?pid。
*/
public static final String PID = "";
/**
* 用于支付寶賬戶登錄授權業(yè)務的入?yún)?target_id。
*/
public static final String TARGET_ID = "";
private static final int SDK_AUTH_FLAG = 2;
/**
* pkcs8 格式的商戶私鑰。
*
* 如下私鑰,RSA2_PRIVATE 或者 RSA_PRIVATE 只需要填入一個,如果兩個都設置了,本 Demo 將優(yōu)先
* 使用 RSA2_PRIVATE。RSA2_PRIVATE 可以保證商戶交易在更加安全的環(huán)境下進行,建議商戶使用
* RSA2_PRIVATE。
*
* 建議使用支付寶提供的公私鑰生成工具生成和獲取 RSA2_PRIVATE。
* 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1
*/
public static final String RSA2_PRIVATE = "";
public static final String RSA_PRIVATE = "";
/**
* 支付寶賬戶授權業(yè)務示例
*/
public void authV2(View v) {
if (TextUtils.isEmpty(PID) || TextUtils.isEmpty(APPID)
|| (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE))
|| TextUtils.isEmpty(TARGET_ID)) {
showAlert(this, getString(R.string.error_auth_missing_partner_appid_rsa_private_target_id));
return;
}
/*
* 這里只是為了方便直接向商戶展示支付寶的整個支付流程;所以Demo中加簽過程直接放在客戶端完成;
* 真實App里,privateKey等數(shù)據(jù)嚴禁放在客戶端,加簽過程務必要放在服務端完成;
* 防止商戶私密數(shù)據(jù)泄露,造成不必要的資金損失,及面臨各種安全風險;
*
* authInfo 的獲取必須來自服務端;
*/
boolean rsa2 = (RSA2_PRIVATE.length() > 0);
Map<String, String> authInfoMap = OrderInfoUtil2_0.buildAuthInfoMap(PID, APPID, TARGET_ID, rsa2);
String info = OrderInfoUtil2_0.buildOrderParam(authInfoMap);
String privateKey = rsa2 ? RSA2_PRIVATE : RSA_PRIVATE;
String sign = OrderInfoUtil2_0.getSign(authInfoMap, privateKey, rsa2);
final String authInfo = info + "&" + sign;
Runnable authRunnable = new Runnable() {
@Override
public void run() {
// 構造AuthTask 對象
AuthTask authTask = new AuthTask(PayDemoActivity.this);
// 調(diào)用授權接口,獲取授權結果
Map<String, String> result = authTask.authV2(authInfo, true);
Message msg = new Message();
msg.what = SDK_AUTH_FLAG;
msg.obj = result;
mHandler.sendMessage(msg);
}
};
// 必須異步調(diào)用
Thread authThread = new Thread(authRunnable);
authThread.start();
}
@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”則代表授權成功,具體狀態(tài)碼代表含義可參考授權接口文檔
if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
// 獲取alipay_open_id,調(diào)支付時作為參數(shù)extern_token 的value
// 傳入,則支付賬戶為該授權賬戶
LogUtils.e(authResult.toString());
String authCode = authResult.getAuthCode();
String aliPayOpenId = authResult.getAlipayOpenId();
String state = authResult.getResult();
//TODO本地服務的三方登錄接口
mViewModel.upLoginThree("social", "all", "alipay", authCode, "alipay", "", "", "");
} else {
// 其他狀態(tài)值則為授權失敗
LogUtils.e("其他狀態(tài)值則為授權失敗");
}
break;
}
default:
break;
}
}
;
};
支付寶登錄授權官方文檔地址:
https://opendocs.alipay.com/open/218/105325