乐虎游戏|乐虎国际登录|欢迎你

Android微信登录、分享、支付

日期:2020-03-15编辑作者:计算机资讯

转发要求盛名出处:

http://blog.csdn.net/lowprofile_coding/article/details/78004224

前面写过微信登陆分享支付第一版:

http://blog.csdn.net/lowprofile_coding/article/details/48086381

前言

大部的app都有对接第三方sdk的须要。举个例子第三方登陆要求连接Wechat、QQ、博客园。第三方支付须要衔接微信、支付宝、银联。

这么些小编都有应用过,皆有应用过他们的sdk,认为最麻烦的就是Wechat,无法一贯调节和测验,得用正式的具名进行签名才能调度。还会有他们官方的demo也是跑不起来的,因为还没签字文件。须要当心的地方也比非常多。

代码达成

Wechatsdk今后帮忙Android Studio在线引用了,在此以前都以增添jar的办法。要求探访Wechat的接口获取客户消息,所以把我们早先封装的okhttp也一起在线援引。okhttp须求在自定义的Application中起首化这几个本人就不贴代码了。在此以前已经讲过很频仍。在app/build.gradle文件dependencies标签中插足以下两行代码:

compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'compile 'com.ansen.http:okhttpencapsulation:1.0.1'

急需用到网络,所以在AndroidManifest.xml文件中走入互连网权限:

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

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登录之后信息在这里显示"/> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android: android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="昵称:"/> <TextView android: android:layout_below="@+id/tv_nickname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="年龄:"/> </RelativeLayout> <Button android: android:layout_width="match_parent" android:layout_height="wrap_content" android:text="微信登录"/> <Button android: android:layout_width="match_parent" android:layout_height="wrap_content" android:text="分享到朋友圈"/> <Button android: android:layout_width="match_parent" android:layout_height="wrap_content" android:text="分享给好友"/> <Button android: android:layout_width="match_parent" android:layout_height="wrap_content" android:text="微信支付"/></LinearLayout>

布局文件很简短,就LinearLayout里面放了几个TextView,跟多少个按键。

WeiXin.java 用于伊芙ntBus来传送音信,Wechatsdk有个很想获得的地点,就是无论登入、分享、支付之后都得用三个Activity来选取,所以我们还得从选用的百般activity把结果新闻透过伊芙ntBus传递给MainActivity。尽管用广播也能达成,可是个人心仪用EventBus,使用灵活。轻便轻量。

public class WeiXin { private int type;//1:登录 2.分享 3:微信支付 private int errCode;//微信返回的错误码 private String code;//登录成功才会有的code public WeiXin() { } public WeiXin(int type,int errCode, String code) { this.type = type; this.errCode=errCode; this.code = code; } public int getType() { return type; } public void setType { this.type = type; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public int getErrCode() { return errCode; } public void setErrCode(int errCode) { this.errCode = errCode; }}

Constant.java 常量类,Wechatappid跟secret的值用八个常量保存。为了维护隐秘那多个值小编一度修正过。

public class Constant { public static String WECHAT_APPID="wxda6db2aec81389af"; public static String WECHAT_SECRET="8fed5a2d510022587ef8a6194c965be3";}

MainActivity.java 全体代码贴出来相比较乱,目前贴出MainActivity部分代码。

public class MainActivity extends AppCompatActivity implements View.OnClickListener { private IWXAPI wxAPI; private TextView tvNickname,tvAge; public static final int IMAGE_SIZE=32768;//微信分享图片大小限制 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); EventBus.getDefault().register;//注册 wxAPI = WXAPIFactory.createWXAPI(this,Constant.WECHAT_APPID,true); wxAPI.registerApp(Constant.WECHAT_APPID); findViewById(R.id.btn_login).setOnClickListener; findViewById(R.id.btn_share_friend_circle).setOnClickListener; findViewById(R.id.btn_share_friend).setOnClickListener; findViewById(R.id.btn_pay).setOnClickListener; tvNickname=  findViewById(R.id.tv_nickname); tvAge= findViewById(R.id.tv_age); } @Override public void onClick(View view) { switch (view.getId{ case R.id.btn_login://微信登录 login(); break; case R.id.btn_share_friend_circle://微信分享到朋友圈 share; break; case R.id.btn_share_friend://微信分享给朋友 share; break; case R.id.btn_pay://微信支付// 先去服务器获取支付信息,返回一个WeiXinPay对象,然后调用pay方法 showToast("微信支付需要服务器支持"); break; } } /** * 这里用到的了EventBus框架 * @param weiXin */ @Subscribe public void onEventMainThread(WeiXin weiXin){ Log.i("ansen","收到eventbus请求 type:"+weiXin.getType; if(weiXin.getType{//登录 getAccessToken(weiXin.getCode; }else if(weiXin.getType{//分享 switch (weiXin.getErrCode{ case BaseResp.ErrCode.ERR_OK: Log.i("ansen", "微信分享成功....."); break; case BaseResp.ErrCode.ERR_USER_CANCEL://分享取消 Log.i("ansen", "微信分享取消....."); break; case BaseResp.ErrCode.ERR_AUTH_DENIED://分享被拒绝 Log.i("ansen", "微信分享被拒绝....."); break; } }else if(weiXin.getType{//微信支付 if(weiXin.getErrCode()==BaseResp.ErrCode.ERR_OK){//成功 Log.i("ansen", "微信支付成功....."); } } } .......... public void showToast(String message){ Toast.makeText(this,message,Toast.LENGTH_LONG).show(); } @Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister;//取消注册 }}
  • onCreate 注册EventBus,通过WXAPIFactory创制IWXAPI类,并且注册appid,给多少个开关按键设置点击事件。查找突显名字跟年龄的多少个TextView。
  • onClick 点击事件监听,依据id来判断点击分裂的开关,跳转到相应的秘诀,那么些点子没贴出来来,等会单独讲。
  • onEventMainThread(WeiXin weiXin卡塔尔用来采纳消息,这么些主意有个参数,用来推断项目,正是大家用EventBus发送时参数必需是WeiXin类型。首先剖断type,是登入照旧分享照旧支付。登陆成功景观下会取获得code,依照code然后大家就会得到到Wechat客户新闻。
  • showToast Toast提示
  • onDestroy 取消EventBus注册

Wechat登陆

Wechat登入流程有以下三个步骤:

  • Wechat授权登陆
  • 传闻授权登入code 获取该客商token
  • 依附token获取客商资料

当大家点击登录按键的时候,调用的是login方法。那几个办法就在MainActivity里头。便是给Wechat发起二个登陆诉求,弹出二个授权分界面。

public void login(){ SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = String.valueOf(System.currentTimeMillis; wxAPI.sendReq;}

在您的包名相应目录下新建三个wxapi目录,然后在wxapi目录下增加生产总量二个WXEntryActivity类,用来选取登陆授权甚至享受时Wechat的回调音讯。这些类世袭自Activity,须要落到实处IWXAPIEventHandler接口。

package com.ansen.shoenet.wxapi;public class WXEntryActivity extends Activity implements IWXAPIEventHandler { private IWXAPI wxAPI; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); wxAPI = WXAPIFactory.createWXAPI(this,Constant.WECHAT_APPID,true); wxAPI.registerApp(Constant.WECHAT_APPID); wxAPI.handleIntent(getIntent; } @Override protected void onNewIntent(Intent intent){ super.onNewIntent; wxAPI.handleIntent(getIntent; Log.i("ansen","WXEntryActivity onNewIntent"); } @Override public void onReq(BaseReq arg0) { Log.i("ansen","WXEntryActivity onReq:"+arg0); } @Override public void onResp(BaseResp resp){ if(resp.getType()== ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX){//分享 Log.i("ansen","微信分享操作....."); WeiXin weiXin=new WeiXin(2,resp.errCode,""); EventBus.getDefault().post; }else if(resp.getType()==ConstantsAPI.COMMAND_SENDAUTH){//登陆 Log.i("ansen", "微信登录操作....."); SendAuth.Resp authResp = (SendAuth.Resp) resp; WeiXin weiXin=new WeiXin(1,resp.errCode,authResp.code); EventBus.getDefault().post; } finish(); }}

onCreate、onNewIntent、onReq那多少个形式是永远写法。onResp方法接受Wechat结果新闻,首先判定项目,依照不一致的体系去封装WeiXin对象,假诺是登入操作,把code传入进去,然后把包装好的WeiXin对象通过EventBus发送出去。MainActivity的onEventMainThread方法就能够收下到这一个新闻。最终调用finish关闭当前的activity。

WXEntryActivity记得在AndroidManifest.xml中注册

<activity android:exported="true" android:name=".wxapi.WXEntryActivity"/>

连绵起伏回来首页的on伊夫ntMainThread,假诺登陆类型调用getAccessToken(卡塔尔(قطر‎,而且传入code。依照code获取access_token,这一个url是Wechat公开的,需求传入四个参数,appid、secret、code。哀告成功之后会回到access_token跟openid等信息。

public void getAccessToken(String code){ String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" + "app&secret="+Constant.WECHAT_SECRET+ "&code="+code+"&grant_type=authorization_code"; HTTPCaller.getInstance().get(WeiXinToken.class, url, null, new RequestDataCallback<WeiXinToken>() { @Override public void dataCallback(WeiXinToken obj) { if(obj.getErrcode{//请求成功 getWeiXinUserInfo; }else{//请求失败 showToast(obj.getErrmsg; } } });}

获取到access_token跟openid之后持续调用getWeiXinUserInfo方法获取客商音讯。那样就能够取到当前Wechatapp登入的客商一些音讯。有外号、年龄、头像地址、语言等主旨音信。在店堂成本中,到了这一步就足以拿着这几个音讯调用本身服务器的记名接口。当然大家这边就把外号跟年龄给TextView显示下。

public void getWeiXinUserInfo(WeiXinToken weiXinToken){ String url = "https://api.weixin.qq.com/sns/userinfo?access_token="+ weiXinToken.getAccess_token()+"&open昵称:"+obj.getNickname; tvAge.setText("年龄:"+obj.getAge; Log.i("ansen","头像地址:"+obj.getHeadimgurl;}

WeiXinToken跟WeiXinInfo那三个实体类就不贴代码了,WeiXinToken用来映射获取访问token接口再次回到的json。WeiXinInfo用来映射获取顾客接口重回的json。

微信分享

分享有二种享受到对象圈跟分享给亲密的朋友,统一调用share方法。传入多个boolean类型来判别是不是分享到对象圈。

public void share(boolean friendsCircle){ WXWebpageObject webpage = new WXWebpageObject(); webpage.webpageUrl = "www.baidu.com";//分享url WXMediaMessage msg = new WXMediaMessage; msg.title = "分享标题"; msg.description = "分享描述"; msg.thumbData =getThumbData();//封面图片byte数组 SendMessageToWX.Req req = new SendMessageToWX.Req(); req.transaction = String.valueOf(System.currentTimeMillis; req.message = msg; req.scene = friendsCircle ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession; wxAPI.sendReq;}

享受内容有超多格式,分享图片、分享摄像、分享音讯。我们那边就享受消息为例,也是享受相比高高挂起的格式。首先new二个WXWebpageObject对象,设置标题、内容、展开链接、封面等。最后调用wxAPI的sendReq放松四个伸手。

享用跟登入相像,都会回调WXEntryActivity,然后又把分享结果发送给MainActivity.onEventMainThread方法。

支付支付第一需求诉求我们温馨的服务器,获取支付消息。获取成功以往调用pay方法。

public void pay(WeiXinPay weiXinPay){ PayReq req = new PayReq(); req.appId = Constant.WECHAT_APPID;//appid req.nonceStr=weiXinPay.getNoncestr();//随机字符串,不长于32位。推荐随机数生成算法 req.packageValue=weiXinPay.getPackage_value();//暂填写固定值Sign=WXPay req.sign=weiXinPay.getSign();//签名 req.partnerId=weiXinPay.getPartnerid();//微信支付分配的商户号 req.prepayId=weiXinPay.getPrepayid();//微信返回的支付交易会话ID req.timeStamp=weiXinPay.getTimestamp();//时间戳 wxAPI.registerApp(Constant.WECHAT_APPID); wxAPI.sendReq;}

weiXinPay的值应该是我们从友好服务器获取的,然后把再次来到消息打包到PayReq对象中,最后调用wxAPI的sendReq方法发起号召。

在wxapi目录下增加产能一个WXPayEntryActivity类,那一个类跟WXEntryActivity同级,用来抽出Wechat支付的回调新闻。这么些类世襲自Activity,须求得以完成IWXAPIEventHandler接口。

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler { private IWXAPI wxAPI; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); wxAPI = WXAPIFactory.createWXAPI(this, Constant.WECHAT_APPID); wxAPI.handleIntent(getIntent; } @Override protected void onNewIntent(Intent intent){ super.onNewIntent; setIntent; wxAPI.handleIntent(intent, this); } @Override public void onReq(BaseReq baseReq) {} @Override public void onResp(BaseResp resp) { Log.i("ansen", "微信支付回调 返回错误码:"+resp.errCode+" 错误名称:"+resp.errStr); if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX){//微信支付 WeiXin weiXin=new WeiXin(3,resp.errCode,""); EventBus.getDefault().post; } finish(); }}

其余方法都以定点写法,在onResp中推断如果是Wechat登陆,就封装叁个WeiXin对象,然后发送伊芙ntBus央浼。那样MainActivity的on伊夫ntMainThread就能够收取到这些WeiXin对象。

WXPayEntryActivity记得在AndroidManifest.xml中注册。

<activity android:exported="true" android:name=".wxapi.WXPayEntryActivity"/>

品种布局图如下所示,从图中大家看看软件包名是com.ansen.shoenet。接受Wechat登入支付再次来到的Activity的包名必得是com.ansen.shoenet.wxapi。八个activity的名字也是一定写法。

图片 1project_structure

签名

Wechat登四分享支付都有二个签字验证,那么些很费劲,引致每趟调节和测量检验都需求再行具名。

率先用android studio生成三个正规的具名文件,签字文件是.jks结尾的,那几个具名文件是你现在打线上包直接要用到的。然后用那一个具名文件生成apk。此时大家的app就有了规范签定。把正规化签订左券的apk发送到手机上开展设置。

再者下载三个签字生成工具安装,那一个工具用于获取安装到手提式无线电电话机的第三方使用签字的apk包。Wechat官方下载地址:

https://res.wx.qq.com/open/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android2.apk

上述七个app都安装好了随后张开从Wechat下载的不行app,软件名字叫「GenSignature」,有四个输入框,输入大家软件的包名,点击Get Signature开关.效果图如下:

图片 2get_signature

把这行血红的16进制数炒下来保存到txt文本中。

Wechatsdk官方网站后台配置

官方网址地址:

https://open.weixin.qq.com/

在Wechatsdk首页,有个管理核心点击之后暗中认可正是移动使用,假设还尚无开创移动应用就先创造三个,如若有了就点击当前的接收后边的查阅按键,就能够进入应用详细分界面。

在行使详细分界面一贯往下滚动,滚到最尾部有个开采音信。点击改进,踏向改良分界面,在改变分界面滚动到最上边,效果图如下所示:

图片 3app_info

首先大家在Android应用这里打上勾,然后填写应用签名,这几个签字都以本人事情发生早前要你们保存到记事本上的分外值,包名正是app包名。点击保存。

运行软件

登入之后效果图如下:

图片 4login_success

享用到对象圈如下:

图片 5share_friend_circle

享受给相恋的人:

图片 6share_friend

Wechat支付没办法测量试验,因为急需服务器扶助。

Wechat官方开垦文书档案

自己那偏文章只是对准将来Wechat的sdk版本接入,不过sdk是有一点都不小可能率调换的,版本变化、接口变化等。所以建议我们照旧以合丹麦语档为主。小编的文章提供参照他事他说加以考察。

挪动应用Wechat登陆开辟指南

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=219192a54f13e8e7011ced8e4ce5b36b699629c4&lang=zh_CN

AndroidWechat支付开辟手册

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317784&token=219192a54f13e8e7011ced8e4ce5b36b699629c4&lang=zh_CN

注意事项

联网Wechatsdk有不计其数亟待静心之处,这里大家最后再来做一个计算。

  • Wechat登入,分享,支付回调的Activity包名跟类名应当要严刻根据必要去写
  • 收受回调的是Activity一定要在AndroidManifest.xml中中登记
  • Constant里面八个常量的值要去Wechat报名並且创办应用才有的,这里供给改成你们申请的值。
  • 亟需拜见网络所以记得在AndroidManifest.xml中加多权限
  • 调用Wechat的登录,分享,支付你的安装包必要求有签字,签字新闻必要求跟你在Wechat官互连网配置的签署消息雷同
  • Wechat未有客服扶植.....如果出了难点看官方的德姆o可能法定API
  • WechatSDK平常晋级,假若您付出的时候有新型的就用新型的吧.....

最后的末梢

你们一直运转作者的demo是拾分的,因为你们未有的jks文件,无法签字,并且源码中的appid跟secret被本身纠正过了,是不可能运用的,可是你们大概又想看运转效果,所以自个儿在品种下建了个apk文件夹,里面放了三个方可测验Wechat登四分享的apk安装包。

源码下载

若果您想第临时间看作者的末代文章,扫码关怀公众号,周周不定时推送Android开辟实战教程随笔...

 Android开发666 - 安卓开发技术分享 扫描二维码加关注

图片 7Android开发666

本文由乐虎游戏发布于计算机资讯,转载请注明出处:Android微信登录、分享、支付

关键词:

Git使用简析

推送本地操作 初始化一个本地Git仓库,在需要添加版本控制的文件夹根目录中使用gitinit命令。 添加文件到本地Git仓...

详细>>

如何在移动开发者的寒冬中破冰而出?

世家好,好像有那么几天没写小说了,重要是近日一向很忙,没什么时间放平心态写。 在这里个行业,每间隔一段时...

详细>>

Android WebView基本使用

转载请注明出处: WebView 使用简介 http://blog.csdn.net/lowprofile_coding/article/details/77928614 一 WebView 相关的类 WebView介绍 Andr...

详细>>

乐虎国际登录:话说Svn与Git的区别(以后别再问我了)

这篇主要是谈谈两者的区别,至于谁优谁劣看官自己思考吧! 最核心的区别Git是分布式的,而Svn不是分布的。能理解...

详细>>