**

Android 微信支付宝授权

**
最近项目中要实现微信支付宝授权获取用户信息以及支付,在网上查了很多资料,项目中将两个平台的收取与支付写在了一起,记录一下以便以后使用时查看。

1. 微信&支付宝sdk下载

一、微信平台&支付宝平台申请应用

去微信开放平台(默认你已经注册了微信开发平台账号,微信支付需要开发者资质验证好像是300大洋,一般由公司提供账号)创建应用,如下图,在管理中心创建应用,按提示操作进行就行,没什么难的


应用通过以后在 开发信息 中填上你应用的应用包名和应用签名
填写的包名一定要跟你要集成的APP的包名一致,也就是你项目下,AndroidManifest文件下的pakage或者build.gradle文件下的applicationid
AndroidManifest:
app->build.gradle:
获取应用签名:
1、微信开放平台下载开发工具包(SDK)和签名工具

A==/dissolve/70)

2、将下载的“签名工具”APK,安装到手机。在该手机上安装你打包的应用的APK并运行,通过签名生成工具输入包名get signature获取应用签名,填写到微信开发平台,平台会分配给你AppID和AppSecret。


支付宝应用申请与微信类似,得到PID,APPID和RSA2_PRIVATE
支付宝开放平台下载sdk
官网地址下载sdk和demo

二、项目中使用

1、将wechat-sdk-android-with-mta-1.0.2.jar和alipaySdk-20160223.jar 拷贝到我们工程的libs下,并添加到依赖中


Android Studio环境下:已改用gradle形式,使用gradle来编译、更新微信SDK。

在build.gradle文件中,添加如下依赖即可:

dependencies {

compile ‘com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+’

}

dependencies {

compile ‘com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+’

}
2、配置AndroidManifest添加如下代码:

权限<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" />
//微信
<activityandroid:name=".wxapi.WXEntryActivity"android:exported="true"android:launchMode="singleTop"android:theme="@android:style/Theme.Translucent"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><data android:scheme="微信给你的AppID" /></intent-filter></activity><activityandroid:name=".wxapi.WXPayEntryActivity"android:exported="true"android:launchMode="singleTop"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><data android:scheme="wx8d024c5351b07056" /></intent-filter></activity>//支付宝<!-- alipay sdk begin --><activityandroid:name="com.alipay.sdk.app.H5PayActivity"android:configChanges="orientation|keyboardHidden|navigation|screenSize"android:exported="false"android:screenOrientation="behind"android:windowSoftInputMode="adjustResize|stateHidden" /><activityandroid:name="com.alipay.sdk.app.H5AuthActivity"android:configChanges="orientation|keyboardHidden|navigation"android:exported="false"android:screenOrientation="behind"android:windowSoftInputMode="adjustResize|stateHidden" /><!-- alipay sdk end -->

2、微信需要在项目中有回调类处理微信返回的信息,必须在你app包名下面新建文件夹wxapi,然后新建类名必须为:授权: WXEntryActivity,支付:WXPayEntryActivity

项目中使用微信&支付宝请求授权的代码:

 public class AuthUtils {/** 支付宝支付业务:入参app_id */public static final String APPID = "你的APPID";/** 支付宝账户登录授权业务:入参pid值 */public static final String PID = "你的PID";/** 支付宝账户登录授权业务:入参target_id值 */public static final String TARGET_ID = "1";public static final String RSA2_PRIVATE = "你的RSA2_PRIVATE ";public static final String RSA_PRIVATE = "";private static Context mContext;private static final int SDK_AUTH_FLAG=1002;public static String userId="";public static String authCode="";private static AliAuthBack mAliAuthBack;/*** 调用支付宝的授权* @param content 后台传过来的数据* @param context 上下文*/public static void  setAliAuth(final String content,Context context){mContext=context;//检测是否安装支付宝Uri uri=Uri.parse("alipays://platformapi/startApp");Intent intent=new Intent(Intent.ACTION_VIEW,uri);ComponentName componentName=intent.resolveActivity(context.getPackageManager());//确认安装支付宝后进行授权接口调用if(componentName!=null){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() {@Overridepublic void run() {//构造AuthTask对象AuthTask authTask=new AuthTask((Activity)mContext);//调用授权接口,获取授权结果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();}else{ToastUtil.show("请您先安装支付宝");}}private static Handler mHandler=new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case SDK_AUTH_FLAG: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// 传入,则支付账户为该授权账户if(mAliAuthBack!=null){mAliAuthBack.authInfo(authResult.getAuthCode(),authResult.getUserId());}
//                    Toast.makeText(mContext, "授权成功\n" + String.format("authCode:%s", authResult.getAuthCode()), Toast.LENGTH_SHORT)
//                            .show();Toast.makeText(mContext, "授权成功", Toast.LENGTH_SHORT).show();} else {// 其他状态值则为授权失败Toast.makeText(mContext, "授权失败", Toast.LENGTH_SHORT).show();}break;}}};private  void setAuthCode(String authCode){this.authCode=authCode;}public void setAliAuthBack(AliAuthBack back){this.mAliAuthBack=back;}public interface AliAuthBack{void authInfo(String authCode,String userId);}public static void WechatAuth(Context context){final IWXAPI api= WXAPIFactory.createWXAPI(context,null);api.registerApp(Const.WeChat_APPID);if(!api.isWXAppInstalled()){ToastUtil.show("请您先安装微信");}else {final SendAuth.Req req=new SendAuth.Req();req.scope="snsapi_userinfo";req.state="wechat_sdk_demo_test";api.sendReq(req);}}
}

支付宝:
1、判断是否安装支付宝 2、发送授权请求 这里必须要异步处理 3、支付宝返回的用户信息 这里利用回调AliAuthBack.authInfo() 将信息返回给Activity;
项目中定义了对象AuthResult用于接受支付宝的返回信息;

AuthResult 代码:

public class AuthResult {private String resultStatus;private String result;private String memo;private String resultCode;private String authCode;private String alipayOpenId;private String userId;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;}if (value.startsWith("user_id")) {userId = removeBrackets(getValue("user_id=", 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;}@Overridepublic 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;}/*** @return the userId*/public String getUserId() {return userId;}
}

微信:
1、判断是否安装微信 2、发送授权请求 3、用户操作后回调WXEntryActivity的onResp方法。

类WXEntryActivity代码如下:
基本时按照官方demo做了一点修改
其中 Const.WeChat_APPID,Const.WeChat_APP_SECRET 就是微信分配的 APPID和AppSecret
这些信息最好是通过服务端获取,在客户端会有安全问题。

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {private IWXAPI api;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.entry);api = WXAPIFactory.createWXAPI(this, Const.WeChat_APPID, false);//微信的appIdtry {api.handleIntent(getIntent(), this);} catch (Exception e) {e.printStackTrace();}}@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);api.handleIntent(intent, this);finish();}//微信发送请求到第三方应用时,会回调到该方法@Overridepublic void onReq(BaseReq req) {switch (req.getType()) {case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:goToGetMsg();break;case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:goToShowMsg((ShowMessageFromWX.Req) req);break;default:break;}}//第三方应用发送到微信的请求处理后的响应结果,会回调到该方法@Overridepublic void onResp(BaseResp resp) {int result = 0;//Toast.makeText(this, "baseresp.getType = " + resp.getType(), Toast.LENGTH_SHORT).show();switch (resp.errCode) {case BaseResp.ErrCode.ERR_OK:result = R.string.errcode_success;//微信分享if (resp.getType() == ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX)this.finish();else{String code = ((SendAuth.Resp) resp).code;//获取用户信息getAccessToken(code);}break;case BaseResp.ErrCode.ERR_USER_CANCEL:result = R.string.errcode_cancel;this.finish();break;case BaseResp.ErrCode.ERR_AUTH_DENIED:result = R.string.errcode_deny;break;case BaseResp.ErrCode.ERR_UNSUPPORT:result = R.string.errcode_unsupported;break;default:result = R.string.errcode_unknown;break;}Toast.makeText(this, result, Toast.LENGTH_LONG).show();}private void goToGetMsg() {}private void goToShowMsg(ShowMessageFromWX.Req showReq) {}private void getAccessToken(String code) {//获取授权StringBuffer loginUrl = new StringBuffer();loginUrl.append("https://api.weixin.qq.com/sns/oauth2/access_token").append("?appid=").append(Const.WeChat_APPID).append("&secret=").append(Const.WeChat_APP_SECRET).append("&code=").append(code).append("&grant_type=authorization_code");OkHttpUtils.ResultCallback<String> resultCallback = new OkHttpUtils.ResultCallback<String>() {@Overridepublic void onSuccess(String response) {String access = null;String openId = null;try {JSONObject jsonObject = new JSONObject(response);access = jsonObject.getString("access_token");openId = jsonObject.getString("openid");} catch (Exception e) {e.printStackTrace();}//获取个人信息String getUserInfo = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access + "&openid=" + openId;OkHttpUtils.ResultCallback<String> reCallback = new OkHttpUtils.ResultCallback<String>() {@Overridepublic void onSuccess(String response) {String nickName = null;String sex = null;String city = null;String province = null;String country = null;String headimgurl = null;WechatUserInfo info = new WechatUserInfo();try {JSONObject jsonObject = new JSONObject(response);String deviceId= AppBaseApplication.getInstance().getDeviceInfo().deviceId;info.setMemberID(deviceId);info.setOpenId(jsonObject.getString("openid"));info.setNickName(jsonObject.getString("nickname"));info.setSex(jsonObject.getString("sex"));info.setCountry(jsonObject.getString("country"));info.setProvince(jsonObject.getString("province"));info.setCity(jsonObject.getString("city"));info.setHeadimgurl(jsonObject.getString("headimgurl"));info.setUnionid(jsonObject.getString("unionid"));//传到Activity/*Intent i= new Intent(WXEntryActivity.this,PutForwardBindActivity.class);i.putExtra("userInfo",info);startActivity(i);*///添加到数据库WechatUserInfoDaoImpl wechatImpl = new WechatUserInfoDaoImpl(HsApplication.getInstance());wechatImpl.insert(info);finish();} catch (JSONException e) {e.printStackTrace();}}@Overridepublic void onFailure(Exception e) {ToastUtil.show(WXEntryActivity.this,"获取信息失败");finish();}};OkHttpUtils.get(getUserInfo.toString(), reCallback);}@Overridepublic void onFailure(Exception e) {ToastUtil.show(WXEntryActivity.this,"登录失败");finish();}};OkHttpUtils.get(loginUrl.toString(), resultCallback);}}

重点注意onResp这个方法是应用发送到微信的请求处理后的响应结果,会回调到该方法
1、判断 resp.errCode的值 成功会返回并且带上授权临时票据code参数;
2、通过code参数加上AppID和AppSecret等,通过API调用获得access_token;
3、通过access_token进行接口调用,获取用户基本数据信息
这里获取到用户基本信息后我这里存到了本地数据库(使用OrmLite框架,参考https://www.cnblogs.com/itgungnir/p/6210949.html),可以用其他方式返回微信的个人信息。

OkHttpUtils的代码:

public class OkHttpUtils {private static OkHttpUtils mInstance;private OkHttpClient mOkHttpClient;private Handler mDelivery;protected static Retrofit mRetrofit;private OkHttpUtils() {mOkHttpClient = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).writeTimeout(10, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).build();mDelivery = new Handler(Looper.getMainLooper());}private synchronized static OkHttpUtils getmInstance() {if (mInstance == null) {mInstance = new OkHttpUtils();}return mInstance;}private void getRequest(String url, final ResultCallback callback) {final Request request = new Request.Builder().url(url).build();deliveryResult(callback, request);}private void postRequest(String url, final ResultCallback callback, List<Param> params) {Request request = buildPostRequest(url, params);deliveryResult(callback, request);}/*** 处理结果* @param callback* @param request*/private void deliveryResult(final ResultCallback callback, Request request) {mOkHttpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {sendFailCallback(callback, e);}@Overridepublic void onResponse(Call call, Response response) throws IOException {try {String str = response.body().string();if (callback.mType == String.class) {/*** 返回字符串*/sendSuccessCallBack(callback, str);} else {/*** 这里处理解析返回对象*/Object object = JSON.parseObject(str, callback.mType);sendSuccessCallBack(callback, object);}} catch (final Exception e) {
//                    LogUtils.e(TAG, "convert json failure", e);sendFailCallback(callback, e);}}});}private void sendFailCallback(final ResultCallback callback, final Exception e) {mDelivery.post(new Runnable() {@Overridepublic void run() {if (callback != null) {callback.onFailure(e);}}});}private void sendSuccessCallBack(final ResultCallback callback, final Object obj) {mDelivery.post(new Runnable() {@Overridepublic void run() {if (callback != null) {callback.onSuccess(obj);}}});}private Request buildPostRequest(String url, List<Param> params) {FormBody.Builder builder= new FormBody.Builder();for (Param param : params) {builder.add(param.key, param.value);}RequestBody requestBody = builder.build();return new Request.Builder().url(url).post(requestBody).build();}/**********************对外接口************************//*** get请求* @param url  请求url* @param callback  请求回调*/public static void get(String url, ResultCallback callback) {getmInstance().getRequest(url, callback);}/*** post请求* @param url       请求url* @param callback  请求回调* @param params    请求参数*/public static void post(String url, final ResultCallback callback, List<Param> params) {getmInstance().postRequest(url, callback, params);}/*** http请求回调类,回调方法在UI线程中执行* @param <T>*/public static abstract class ResultCallback<T> {Type mType;public ResultCallback(){mType = getSuperclassTypeParameter(getClass());}static Type getSuperclassTypeParameter(Class<?> subclass) {Type superclass = subclass.getGenericSuperclass();if (superclass instanceof Class) {throw new RuntimeException("Missing type parameter.");}ParameterizedType parameterized = (ParameterizedType) superclass;return parameterized.getActualTypeArguments()[0];}/*** 请求成功回调* @param response*/public abstract void onSuccess(T response);/*** 请求失败回调* @param e*/public abstract void onFailure(Exception e);}/*** post请求参数类   这里可以根据项目抽取成泛型*/public static class Param {String key;String value;public Param() {}public Param(String key, String value) {this.key = key;this.value = value;}}}

Android 微信支付宝授权获取用户信息相关推荐

  1. Spring Boot 微信-网页授权获取用户信息

    微信-验证服务器有效性 微信-网页授权获取用户信息 网页授权获取用户信息步骤 第一步:用户同意授权,获取code 第二步:通过code换取网页授权access_token 第三步:拉取用户信息(需sc ...

  2. PHP 微信网页授权获取用户信息

    最近用到过微信用户授权获取用户信息的功能,在这里记录一下. 因为用户授权要用到认证过的服务号才有权限,而线上正在使用公众号,而开发就有些不方便了,这里可以申请一个微信公众测试号. 1.申请一个微信公众 ...

  3. 微信网页授权获取用户信息实战代码

    微信授权的整体思路: 1 第一步:用户同意授权,获取code 2 第二步:通过code换取网页授权access_token 3 第三步:刷新access_token(如果需要) 4 第四步:拉取用户信 ...

  4. 微信用户绑定java实例_OAuth2.0微信网页授权获取用户信息实现全过程(JAVA版本)...

    一.前言 为什么需要OAuth2.0网页授权接口,主要是为了获取微信用户的基本信息(比如用户绑定,用户统计等等) 特别注意:只有认证的服务号有此接口权限 那么订阅号如何实现这个功能呢?可以通过另一个服 ...

  5. laravel-admin微信网页授权获取用户信息过程

    最近在重构我们平台得前端页面以及逻辑,再此记录一下微信网页版授权获取用户资料得过程 第一步,安装 composer require "overtrue/laravel-wechat:~3.0 ...

  6. 支付宝小程序授权/获取用户信息

    支付宝小程序授权/获取用户信息 目录: 文章目录 支付宝小程序授权/获取用户信息 获取支付宝小程序授权token 解析支付宝小程序接口响应加密数据 获取支付宝小程序授权token ​ 前提准备工作: ...

  7. 支付宝 网页授权 获取用户信息

    ****** 支付宝 网页授权 获取用户信息(昵称,头像等)****** 最近有个项目 需要获取到支付宝的头像和昵称作为互动数据,作为php新人,对于看文档来说 很是痛苦,网上也没有很多关于支付宝网页 ...

  8. 微信公众号开发之授权获取用户信息

    微信开发交流群:148540125 系列文章参考地址 极速开发微信公众号 欢迎留言.转发.打赏 项目源码参考地址 点我点我--欢迎Start 前几篇文章已讲完如何导入项目,如何启动配置项目,如何成为开 ...

  9. Java-(二)微信小程序授权获取用户信息和手机号码

    第一篇我们已经知道了微信小程序怎么授权登录获取用户信息. openId 和 unionId .下面将高速告诉大家,微信小程序如何授权获取用户信息和手机号码. 微信官方文档:https://develo ...

  10. vue h5微信公众号授权获取用户信息

    vue h5微信公众号授权获取用户信息 1.申请测试账号 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 2.修改网页授权 ...

最新文章

  1. 你值得拥有!更省钱地完成数据监听
  2. Oracle客户端安装教程
  3. unity3d所要知道的基础知识体系大纲,可以对照着学习,不定期更新
  4. 如何查找SAP CRM通过中间件Middleware连接的远端ERP系统
  5. 修改Header方法
  6. java的国际化怎么用_Java有关国际化使用实例
  7. 基于三维激光点云的目标识别与跟踪研究
  8. (案例六)三种scrapy模拟登陆策略
  9. 360Stack裸金属服务器部署实践
  10. 如何在 Mac 上下载 macOS Monterey public beta 6?
  11. 拓端tecdat:R语言深度学习卷积神经网络 (CNN)对 CIFAR 图像进行分类:训练与结果评估可视化
  12. Win10鼠标宏怎么设置?电脑设置鼠标宏的方法
  13. 软考论文-写作大纲-备考思路总结
  14. 【转】WinForm界面开发之布局控件WeifenLuo.WinFormsUI.Docking的使用
  15. R语言入门-数据分析DataFrame
  16. 3D模型在线转换,CAD格式转换,Solidworks版本转换
  17. Matlab求极限图解
  18. fix协议封装挑战-数据有效性校验
  19. 《三体3:死神永生》读后感
  20. java设置短信验证码过期时间_实现短信验证码有效时间

热门文章

  1. vue中刷新页面定位导航栏(解决刷新页面导航栏自动定位到首页的问题+路由传参)
  2. mysql my.cnf 生效_mysql配置文件生效顺序
  3. C#:using和new关键字
  4. 速抢:500份粉丝购书优惠券
  5. PAT (Basic Level) Practice (中文)1044 火星数字 (20 分)(Java实现)
  6. jenkins4-jenkins源码管理无法连接仓库:Command git ls-remote -h --
  7. 基于 DirectShow 实现 SourceFilter 常见问题分析
  8. 5G时代的射频器件革命
  9. 2021-10-21python中spilt函数的学习
  10. 脱不花《沟通的方法》读书笔记(一):学会倾听