Android 第三方登入之支付寶登入
阿新 • • 發佈:2018-11-21
首先,貼上支付寶官方開放平臺地址和部分開發文件:
主要流程如下:
- 申請開發者,身份選擇系統服務商ISV,建立應用並獲取APPID。祕鑰生成連結:生成金鑰:快速生成RSA私鑰公鑰
- 配置應用,整合並配置SDK。參考APP支付寶登入快速接入
- 呼叫介面
注意:
(1)這裡是APP支付寶第三方登入,不是第三方應用授權,開發文件不要參考錯了
(2)不要在沙箱環境下做除錯,直接在第一步將建立的應用上線然後再除錯即可(APPID用建立的應用ID,不要用沙箱的)
(3)關於PID引數,不太好找,貼出來位置合作伙伴身份(PID)
下面是程式碼
/** * APP支付寶登入 * * 這裡只是為了方便,直接向加簽過程直接放在客戶端完成; * 真實App裡,privateKey等資料嚴禁放在客戶端,加簽過程務必要放在服務端完成; * 防止商戶私密資料洩露,造成不必要的資金損失,及面臨各種安全風險; */ public class ALiLoginUtils { public Activity activity; /** 支付寶支付業務:入參app_id */ public static final String APPID = "你建立的應用APPID"; /** 支付寶賬戶登入授權業務:入參pid值 */ public static final String PID = "合作伙伴身份PID"; /** 支付寶賬戶登入授權業務:入參target_id值 可自定義,保證唯一性即可*/ public static final String TARGET_ID = "保證唯一性即可"; /** 商戶私鑰,pkcs8格式 */ /** 如下私鑰,RSA2_PRIVATE 或者 RSA_PRIVATE 只需要填入一個 */ /** 如果商戶兩個都設定了,優先使用 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 = ""; private static final int SDK_AUTH_FLAG = 2; public ALiLoginUtils(Activity activity){ this.activity = activity; } @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(); String resultCode = authResult.getResultCode(); Log.e("ALiLoginActivity", "=====resultStatus=====" + resultStatus); Log.e("ALiLoginActivity", "=====resultCode=====" + resultCode); // 判斷resultStatus 為“9000”且result_code // 為“200”則代表授權成功,具體狀態碼代表含義可參考授權介面文件 if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) { // 獲取alipay_open_id,調支付時作為引數extern_token 的value // 傳入,則支付賬戶為該授權賬戶 Log.e("ALiLoginActivity", "授權成功\n" + String.format("authCode:%s", authResult.getAuthCode())); // Toast.makeText(activity,"授權成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show(); } else { // 其他狀態值則為授權失敗 Log.e("ALiLoginActivity", "授權失敗\n" + String.format("authCode:%s", authResult.getAuthCode())); // Toast.makeText(activity,"授權失敗" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show(); } break; } default: break; } }; }; /** * 支付寶賬戶授權業務 */ public void authV2() { if (TextUtils.isEmpty(PID) || TextUtils.isEmpty(APPID) || (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE)) || TextUtils.isEmpty(TARGET_ID)) { new AlertDialog.Builder(activity).setTitle("警告").setMessage("需要配置PARTNER |APP_ID| RSA_PRIVATE| TARGET_ID") .setPositiveButton("確定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialoginterface, int i) { } }).show(); 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; Log.e("ALiLoginActivity", "=====authInfo=====" + authInfo); Runnable authRunnable = new Runnable() { @Override public void run() { // 構造AuthTask 物件 AuthTask authTask = new AuthTask(activity); // 呼叫授權介面,獲取授權結果 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(); } }
然後在Activity中直接呼叫工具類,如下:
/** 支付寶授權登入 */
case R.id.iv_alipay:
ALiLoginUtils aLiLogin = new ALiLoginUtils(LoginActivity.this);
aLiLogin.authV2();
break;
這裡,直接把privateKey等資料放在客戶端,實際加簽過程務必要放在服務端完成;防止商戶私密資料洩露,造成不必要的資金損失,及面臨各種安全風險;authInfo(這裡拼接了要向支付寶傳送的所有資料資訊,尤為重要)的獲取必須來自服務端;
最後,程式碼只貼出了主要的流程,並不完整,其餘的可以參考 App支付客戶端DEMO&SDK
有興趣或者需要的朋友,這裡還有 Android 第三方登入之新浪微博授權登入