在支付宝授权登录之前,有的需要先判断一下手机上是否安装支付宝应用,
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为私钥
/**
* 用于支付宝支付业务的入参 app_id。
*/
public static final String APPID = "";
/**
* 用于支付宝账户登录授权业务的入参 pid。
*/
public static final String PID = "";
/**
* 用于支付宝账户登录授权业务的入参 target_id。
*/
public static final String TARGET_ID = "";
private static final int SDK_AUTH_FLAG = 2;
/**
* pkcs8 格式的商户私钥。
*
* 如下私钥,RSA2_PRIVATE 或者 RSA_PRIVATE 只需要填入一个,如果两个都设置了,本 Demo 将优先
* 使用 RSA2_PRIVATE。RSA2_PRIVATE 可以保证商户交易在更加安全的环境下进行,建议商户使用
* 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 = "";
/**
* 支付宝账户授权业务示例
*/
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等数据严禁放在客户端,加签过程务必要放在服务端完成;
* 防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;
*
* 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);
// 调用授权接口,获取授权结果
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();
}
@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")) {
// 获取alipay_open_id,调支付时作为参数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 {
// 其他状态值则为授权失败
LogUtils.e("其他状态值则为授权失败");
}
break;
}
default:
break;
}
}
;
};
支付宝登录授权官方文档地址:
https://opendocs.alipay.com/open/218/105325