日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

蚂蚁开放平台开发第三方授权登陆(三):Android端

發(fā)布時(shí)間:2023/12/14 Android 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蚂蚁开放平台开发第三方授权登陆(三):Android端 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

開(kāi)發(fā)前提:

擁有支付寶賬戶登錄授權(quán)業(yè)務(wù)入?yún)id值。擁有APPID、App支付寶登錄功能并成功簽約

一、需求

用戶在APP點(diǎn)擊登錄后,選擇第三方登錄中的“支付寶”,跳轉(zhuǎn)到支付寶客戶端進(jìn)行授權(quán)登錄(手機(jī)安裝了支付寶客戶端),或網(wǎng)頁(yè)端掃碼登錄(手機(jī)未安裝支付寶客戶端)。用戶同意登錄后獲取到用戶的基本信息。

?

二、開(kāi)發(fā)流程

APP支付寶授權(quán)登錄獲取用戶信息流程圖:

1.???? Android客戶端調(diào)用支付寶無(wú)線賬戶授權(quán)接口,引導(dǎo)用戶授權(quán),獲取會(huì)員授權(quán)碼(auth_code)與支付寶會(huì)員ID(user_id)。若匹配user_id成功,則完成登錄;否則繼續(xù)下一步。

2.???? 服務(wù)端調(diào)用授權(quán)令牌接口(alipay.system.oauth.token),通過(guò)auth_code換取access_token。auth_code作為換取access_token的票據(jù),auth_code只能使用一次,一天未被使用自動(dòng)過(guò)期。

3.???? 服務(wù)端調(diào)用用戶信息共享接口(alipay.user.info.share),通過(guò)access_token獲取用戶的userId、昵稱(chēng)、頭像等基礎(chǔ)信息。access_token只能使用一次

?

三、開(kāi)發(fā)環(huán)境及使用到的技術(shù)

1、后端采用IDEA2017 進(jìn)行開(kāi)發(fā)

2、前端使用Android Studio 3.1.3 進(jìn)行開(kāi)發(fā)

3、后端必須基于JDK7以上版本,采用JDK8開(kāi)發(fā),前端基于Android SDK4.4

4、使用fastJson對(duì)json數(shù)據(jù)進(jìn)行處理

?

四、具體實(shí)現(xiàn)步驟

1.前端(Android)

目錄結(jié)構(gòu)

1).Android微信授權(quán)登錄開(kāi)發(fā)環(huán)境配置

I.添加支付寶sdk包

將alipaySdk-xxxxxxxx.jar包放入應(yīng)用工程的libs目錄下。

將jar包添加入環(huán)境,將libs目錄下jar包導(dǎo)入。

Build.gradle中,導(dǎo)入包

dependencies {// 支付寶相關(guān)implementation files('libs/alipaySdk-20180601.jar')}

II.修改Manifest文件

添加聲明:

<!--添加聲明--><activityandroid:name="com.alipay.sdk.app.H5PayActivity"android:configChanges="orientation|keyboardHidden|navigation|screenSize"android:exported="false"android:screenOrientation="behind"android:windowSoftInputMode="adjustResize|stateHidden" ></activity><activityandroid:name="com.alipay.sdk.app.H5AuthActivity"android:configChanges="orientation|keyboardHidden|navigation"android:exported="false"android:screenOrientation="behind"android:windowSoftInputMode="adjustResize|stateHidden" ></activity>

添加權(quán)限聲明:

<!--權(quán)限聲明-->

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

?

III.添加混淆規(guī)則:

在proguard-rules.pro文件中添加相關(guān)規(guī)則:

-keep class com.alipay.android.app.IAlixPay{*;}

-keep class com.alipay.android.app.IAlixPay$Stub{*;}

-keep class com.alipay.android.app.IRemoteServiceCallback{*;}

-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}

-keep class com.alipay.sdk.app.PayTask{ public *;}

-keep class com.alipay.sdk.app.AuthTask{ public *;}

-keep class com.alipay.sdk.app.H5PayCallback {

??? <fields>;

??? <methods>;

}

-keep class com.alipay.android.phone.mrpc.core.** { *; }

-keep class com.alipay.apmobilesecuritysdk.** { *; }

-keep class com.alipay.mobile.framework.service.annotation.** { *; }

-keep class com.alipay.mobilesecuritysdk.face.** { *; }

-keep class com.alipay.tscenter.biz.rpc.** { *; }

-keep class org.json.alipay.** { *; }

-keep class com.alipay.tscenter.** { *; }

-keep class com.ta.utdid2.** { *;}

-keep class com.ut.device.** { *;}

?

?

2).引導(dǎo)用戶點(diǎn)擊的按鈕

新建login.xml.添加按鈕

??????? <!--支付寶相關(guān)--><Buttonandroid:id="@+id/authV2"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:onClick="authV2"android:text="支付寶授權(quán)登錄"tools:ignore="HardcodedText" />

當(dāng)用戶點(diǎn)擊后,會(huì)調(diào)用authV2方法

3).loginActivity.java

public class AliPayLoginActivity extends FragmentActivity {@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.login); }

I.相關(guān)配置參數(shù):

private static final int SDK_PAY_FLAG = 1;
private static final int SDK_AUTH_FLAG = 2;

II.auth2方法

商戶重要信息需要存放在服務(wù)端。

Auth2方法中需要做的就是請(qǐng)求我方服務(wù)端獲取參數(shù),根據(jù)參數(shù)請(qǐng)求螞蟻金服開(kāi)放平臺(tái)服務(wù)端。

??? public void authV2(View v) {new Thread(new Runnable() {@Overridepublic void run() {final String authInfo = ApacheHttpUtil.get("http://exzg5x.natappfree.cc"+"/alipay/sign/android");Runnable authRunnable = new Runnable() {@Overridepublic void run() {// 構(gòu)造AuthTask 對(duì)象AuthTask authTask = new AuthTask(AliPayLoginActivity.this);// 調(diào)用授權(quán)接口,獲取授權(quán)結(jié)果Map<String, String> result = authTask.authV2(authInfo, true);Message msg = new Message();msg.what = SDK_AUTH_FLAG;?? //msg.obj = result;mHandler.sendMessage(msg);? // 請(qǐng)求成功后將會(huì)發(fā)送消息到handler處理}};// 必須異步調(diào)用Thread authThread = new Thread(authRunnable);authThread.start();}}).start();}

III.Handler屬性

如果獲取到SDK_AUTH_FLAG消息,判斷狀態(tài)碼成功后,表明授權(quán)成功,螞蟻金服開(kāi)放平臺(tái)將會(huì)返回code和openid,根據(jù)這兩個(gè)參數(shù)向服務(wù)端發(fā)送請(qǐng)求,獲取用戶信息。

根據(jù)請(qǐng)求獲取到的數(shù)據(jù)進(jìn)行解析處理,然后跳轉(zhuǎn)到個(gè)人信息頁(yè)。

@SuppressLint("HandlerLeak")private Handler mHandler = new Handler() {@SuppressWarnings("unused")public void handleMessage(Message msg) {switch (msg.what) {case SDK_AUTH_FLAG: {@SuppressWarnings("unchecked")final AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);String resultStatus = authResult.getResultStatus();// 判斷resultStatus 為“9000”且result_code// 為“200”則代表授權(quán)成功,具體狀態(tài)碼代表含義可參考授權(quán)接口文檔if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {// 獲取alipay_open_id,調(diào)支付時(shí)作為參數(shù)extern_token 的value// 傳入,則支付賬戶為該授權(quán)賬戶Toast.makeText(AliPayLoginActivity.this, "授權(quán)成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT) show();new Thread(new Runnable() {@Overridepublic void run() {// 向服務(wù)端發(fā)送請(qǐng)求,預(yù)計(jì)返回用戶信息數(shù)據(jù),返回給前端進(jìn)行顯示。String url = "http://exzg5x.natappfree.cc" +"/alipay/getalipayMobileUserInfo" + "?" +"app_id=" + Constants.ALPAY_APP_ID +"&auth_code=" + authResult.getAuthCode() +"&scope=auth_user";String str = ApacheHttpUtil.get(url);JSONObject jsonObject =? (JSONObject) JSONObject.parse(str);aliPayUserInfo = (AliPayUserInfo)JSON.parseObject(jsonObject.get("data").toString(), new TypeReference<AliPayUserInfo>() {});}}).start();while (true){// TODO: 這里處理方案不是很合理,死循環(huán)或?qū)⒃斐山缑婵ㄋ纈f (aliPayUserInfo!=null){Intent intent = new Intent(AliPayLoginActivity.this, listviewItem.class);/* 通過(guò)Bundle對(duì)象存儲(chǔ)需要傳遞的數(shù)據(jù) */Bundle bundle = new Bundle();bundle.putString("alipayUserId", aliPayUserInfo.getUserId());bundle.putString("alipayAvatar", aliPayUserInfo.getAvatar());bundle.putString("alipayNickName", aliPayUserInfo.getNickName());bundle.putString("alipayCity", aliPayUserInfo.getCity());bundle.putString("alipayGender", aliPayUserInfo.getGender());bundle.putString("alipayIsCertified", aliPayUserInfo.getIs_certified());bundle.putString("alipayIsStudentCertified", aliPayUserInfo.getIs_student_certified());bundle.putString("alipayProvince", aliPayUserInfo.getProvince());bundle.putString("alipayUserStatus", aliPayUserInfo.getUser_status());bundle.putString("alipayUserType", aliPayUserInfo.getUser_type());/*把bundle對(duì)象assign給Intent*/intent.putExtras(bundle);startActivity(intent);break;}}} else {// 其他狀態(tài)值則為授權(quán)失敗Toast.makeText(AliPayLoginActivity.this, "授權(quán)失敗" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT).show();}break;}default:break;}};};

4).AliPayUserInfoViewItem.java:

需要獲取Bundle,然后將數(shù)據(jù)設(shè)置到對(duì)應(yīng)控件中。

public class listviewItem extends FragmentActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.listview_item);Bundle bundle = this.getIntent().getExtras();TextView alipayUserId = (TextView) findViewById(R.id.alipayUserId);alipayUserId.setText(bundle.getString("alipayUserId"));TextView alipayNickName = (TextView) findViewById(R.id.alipayNickName);alipayNickName.setText(bundle.getString("alipayNickName"));TextView alipayCity = (TextView) findViewById(R.id.alipayCity);alipayCity.setText(bundle.getString("alipayCity"));TextView alipayGender = (TextView) findViewById(R.id.alipayGender);alipayGender.setText(bundle.getString("alipayGender"));TextView alipayIsCertified = (TextView) findViewById(R.id.alipayIsCertified);alipayIsCertified.setText(bundle.getString("alipayIsCertified"));TextView alipayIsStudentCertified = (TextView) findViewById(R.id.alipayIsStudentCertified);alipayIsStudentCertified.setText(bundle.getString("alipayIsStudentCertified"));TextView alipayProvince = (TextView) findViewById(R.id.alipayProvince);alipayProvince.setText(bundle.getString("alipayProvince"));TextView alipayUserStatus = (TextView) findViewById(R.id.alipayUserStatus);alipayUserStatus.setText(bundle.getString("alipayUserStatus"));TextView alipayUserType = (TextView) findViewById(R.id.alipayUserType);alipayUserType.setText(bundle.getString("alipayUserType"));}

2.服務(wù)端(Java)

1).服務(wù)端加簽

@ResponseBody @RequestMapping("/sign/{type}") public String sign(@PathVariable("type") String type){if (!StringUtils.isEmpty(type)&&type.equals("android")){Map<String, String> authInfoMap = OrderInfoUtil2_0.buildAuthInfoMap(env.getProperty("alipay.pid"),env.getProperty("alipay.appid"),env.getProperty("alipay.targetId"), true);String info = OrderInfoUtil2_0.buildOrderParam(authInfoMap);String privateKey = env.getProperty("alipay.privatekey");String sign = OrderInfoUtil2_0.getSign(authInfoMap, privateKey, true);final String authInfo = info + "&" + sign;return authInfo;}return null; }

2).配置

增加配置pid以及targetId。

其中pid為商戶pid,targetId為商戶自定義的id

# 商戶pid
alipay.pid =

# TARGET_ID
# 支付寶賬戶登錄授權(quán)業(yè)務(wù):入?yún)arget_id值,這個(gè)target_id參數(shù)是商戶自定義的,不需要獲取。
alipay.targetId =

?

3).獲取用戶信息

@ResponseBody@RequestMapping("/getalipayMobileUserInfo")public Result getALiPayMobileUserInfo(HttpServletRequest httpServletRequest) {String appId = httpServletRequest.getParameter("app_id");String scope = httpServletRequest.getParameter("scope");String authCode = httpServletRequest.getParameter("auth_code");if (appId == null || scope == null || authCode == null ){Result.error(CodeMsg.PARAM_ISNULL);}// 判定appid是否是我們的 Android傳過(guò)來(lái)的Appid和服務(wù)單Appid有點(diǎn)差異if(!appId.contains(env.getProperty("alipay.appid").trim())){Result.error(CodeMsg.ILLEGAL_PARAM);}AlipayClient alipayClient = new DefaultAlipayClient(env.getProperty("alipay.serverUrl"),env.getProperty("alipay.appid"),env.getProperty("alipay.privatekey"),"json", "UTF-8",env.getProperty("alipay.publickey"),"RSA2"); //獲得初始化的AlipayClientAlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();//創(chuàng)建API對(duì)應(yīng)的request類(lèi)request.setCode(authCode);request.setGrantType("authorization_code");try {AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(request);//通過(guò)alipayClient調(diào)用API,獲得對(duì)應(yīng)的response類(lèi)log.info("AccessToken:"+oauthTokenResponse.getAccessToken());// 獲取用戶信息AliPayUserInfo aliPayUserInfo = getAliPayUserInfo(alipayClient,oauthTokenResponse.getAccessToken());if (aliPayUserInfo==null){Result.error(CodeMsg.FAIL_GETUSERINFO);}// 統(tǒng)一返回結(jié)果。return Result.success(aliPayUserInfo);} catch (AlipayApiException e) {//處理異常e.printStackTrace();}return Result.error(CodeMsg.UNKNOW_ERROR);}

?

五、注意事項(xiàng):

1.Android4.0以上版本,發(fā)送網(wǎng)絡(luò)請(qǐng)求時(shí),必須是以線程異步的方式發(fā)送請(qǐng)求,否則發(fā)送請(qǐng)求會(huì)失敗。

?

?

附錄:

App支付寶登錄授權(quán)參數(shù)

https://docs.open.alipay.com/218/105327

?

總結(jié)

以上是生活随笔為你收集整理的蚂蚁开放平台开发第三方授权登陆(三):Android端的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。