怎么理解android微信js sdk支付分享sdk只能用指定的类名和类路径

前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调过于麻烦,还必须要在指定包名下的actvity进行回调,所以我在这里写一篇博客,有这个需求的朋友可以借鉴一下,以后自己别的项目有用到也有个找资料的地方.
一.微信登陆分三个步骤:
&&1).微信授权登陆& 2).根据授权登陆code 获取该用户token& 3).根据token获取用户资料& 4).接收微信的请求及返回值 如果你的程序需要接收微信发送的请求,或者接收发送到微信请求的响应结果,需要下面3步操作:
& a. 在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity(例如应用程序的包名为net.sourceforge.simcpux,
& & & & 则新添加的类如下图所示)
& & & &&并在manifest文件里面加上exported属性,设置为true,例如:
& & &&b. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法& & & c. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法,示例如下图:
& & 微信官网登陆教程:https://open./cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open&token=&lang=zh_CN
& & 微信官网接入指南:https://open./cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=&token=&lang=zh_CN
二.微信分享直接调用sdk就行,回调跟登陆回调的类是一样的,根据BaseResp的类型来区分是登陆还是分享。
三.微信支付
& & 1).发送一个支付请求
& & 2).接收微信支付的返回值(跟接收微信登陆.分享的返回值类似,我就不写详细操作步骤了)&
& & & & 官网参考地址:https://pay./wiki/doc/api/app.php?chapter=8_5&
四.贴上代码进行讲解
& & 我把微信登陆,分享,支付都封装到了一个类里面了,你们可以参考这个类.封装了6个方法,我对几个需要的方法介绍一下
& & 1).构造方法:初始化对象的时候,顺便初始化微信对象,把app_id注册到微信
& & 2).login() &发起一个登陆的请求 &在微信登陆监听Actviity中获取code
& & 3).getAccessToken(String code) &当你从监听Activity中获取了code之后就可以通过这个方法获取微信访问token了
& & 4).getWeiXinUserInfo(final WeiXinToken obj) &获取微信用户信息 & 传入一个WeiXinToken对象,这个对象是第三步的返回值
& & 5).share(final boolean friendsCircle,final VideoB videoB) & 分享给朋友或者朋友圈 &如果你有分享图片,图片过大的时候一定要经过压缩,微信官网说明图片不能大
& & & & &于32kb
& & 6).isWXAppInstalled() &检查微信是否安装
& & 7).wxPay(final BaseActivity activity,String order_id,String payType) &微信支付 & 我们项目微信支付的一些参数保存在服务器上,所以我这边还请求了自己的
& & & & 服务器,如果你们是放在本地,直接copy回调函数里面的代码即可.在微信支付监听Actviity中获取支付的状态码
& & & &&PayReq类属性对应含义请参考微信官方文档:https://pay./wiki/doc/api/app.php?chapter=9_12
public&class&WeiXinPresenter&extends&Presenter{&&
&&&&public&static&final&int&IMAGE_SIZE=32768;
&&&&public&static&final&String&APP_ID&=&"";
&&&&public&static&final&String&SECRET="";
&&&&private&&IWXAPI&wxAPI;&&
&&&&private&&IView&iV&&
&&&&private&&IUserController&userC&&
&&&&@Override&&
&&&&public&IView&getIView()&{&&
&&&&&&&&return&iV&&
&&&&public&WeiXinPresenter(Context&context){&&
&&&&&&&&if(context!=null&&&&context&instanceof&&IView)&&
&&&&&&&&&&&&iView&=(IView)&&&
&&&&&&&&if(wxAPI==null){&&
&&&&&&&&&&&&wxAPI&=&WXAPIFactory.createWXAPI(context,APP_ID,true);&&
&&&&&&&&&&&&wxAPI.registerApp(APP_ID);&&
&&&&&&&&}&&
&&&&&&&&if(null==userController)&&
&&&&&&&&&&&&userController=ControllerFactory.getUserController();&&
&&&&public&void&login(){&&
&&&&&&&&SendAuth.Req&req&=&new&SendAuth.Req();&&
&&&&&&&&req.scope&=&"snsapi_userinfo";&&
&&&&&&&&req.state&=&String.valueOf(System.currentTimeMillis());&&
&&&&&&&&wxAPI.sendReq(req);&&
&&&&public&void&getAccessToken(String&code){&&
&&&&&&&&if(!userController.isLogin()){
&&&&&&&&&&&&userController.getWeiXinAccessToken(APP_ID,SECRET,code,new&RequestDataCallback&WeiXinToken&(){&&
&&&&&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&&&&&public&void&dataCallback(WeiXinToken&obj){&&
&&&&&&&&&&&&&&&&&&&&if(obj!=null){&&
&&&&&&&&&&&&&&&&&&&&&&&&if(obj.getErrcode()==0){&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(MLog.debug)&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&iView.showToast("授权用户唯一标识:"+obj.getOpenid());&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&getWeiXinUserInfo(obj);&&
&&&&&&&&&&&&&&&&&&&&&&&&}else{&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&iView.showToast(obj.getErrmsg());&&
&&&&&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&&&&&}else{&&
&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&});&&
&&&&&&&&}else{
&&&&&&&&&&&&&&
&&&&&&&&}&&
&&&&private&void&getWeiXinUserInfo(final&WeiXinToken&obj){&&
&&&&&&&&userController.getWeiXinUserInfo(obj.getAccess_token(),&obj.getOpenid(),&new&RequestDataCallback&RegisterB&()&{&&
&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&public&void&dataCallback(RegisterB&registerB){&&
&&&&&&&&&&&&&&&&registerB.setAccess_token(obj.getAccess_token());&&
&&&&&&&&&&&&&&&&registerB.setToken_expire_at(obj.getExpires_in());&&
&&&&&&&&&&&&&&&&if(registerB.getErrcode()==0){&&
&&&&&&&&&&&&&&&&&&&&registerB.setThird_type_name(Constants.WEI_XIN);&&
&&&&&&&&&&&&&&&&&&&&thirdLogin(registerB);&&
&&&&&&&&&&&&&&&&}else{&&
&&&&&&&&&&&&&&&&&&&&iView.showToast(registerB.getErrmsg());&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&}&&
&&&&&&&&});&&
&&&&private&void&thirdLogin(RegisterB&registerB){&&
&&&&&&&&userController.thirdAuth(registerB,new&RequestDataCallback&UserP&(){&&
&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&public&void&dataCallback(UserP&user){&&
&&&&&&&&&&&&&&&&if(checkCallbackData(user,&true)){&&
&&&&&&&&&&&&&&&&&&&&if(user.getError()==user.ErrorNone){&&
&&&&&&&&&&&&&&&&&&&&&&&&iView.showToast(R.string.login_success);&&
&&&&&&&&&&&&&&&&&&&&&&&&getAppController().sendLoginChangeIntent();&&
&&&&&&&&&&&&&&&&&&&&&&&&userController.saveLoginUser(user,FileUtil.getFilePath());&&
&&&&&&&&&&&&&&&&&&&&&&&&((ILoginView)iView).toMain();&&
&&&&&&&&&&&&&&&&&&&&}else{&&
&&&&&&&&&&&&&&&&&&&&&&&&iView.showToast(user.getError_reason());&&
&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&}&&
&&&&&&&&});&&
&&&&public&void&share(final&boolean&friendsCircle,final&&VideoB&videoB){&&
&&&&&&&&new&LoadPicThread(videoB.getCover_url(),new&Handler(){&&
&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&public&void&handleMessage(Message&msg)&{&&
&&&&&&&&&&&&&&&&byte[]&bytes=(byte[])&msg.&&
&&&&&&&&&&&&&&&&if(bytes.length&IMAGE_SIZE){&&
&&&&&&&&&&&&&&&&&&&&iView.showToast(R.string.image_no_big);&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&System.out.println("图片长度:"+bytes.length);&&
&&&&&&&&&&&&&&&&WXVideoObject&videoObject&=&new&WXVideoObject();
&&&&&&&&&&&&&&&&videoObject.videoUrl&=&videoB.getShare_url()&+&Constants.WEI_XIN&+&"&share_from="+com.kaka.utils.Constants.ANDROID;
&&&&&&&&&&&&&&&&WXMediaMessage&wxMessage&=&new&WXMediaMessage(videoObject);&&
&&&&&&&&&&&&&&&&wxMessage.title&=&videoB.getContent();&&
&&&&&&&&&&&&&&&&wxMessage.thumbData&=&&&
&&&&&&&&&&&&&&&&SendMessageToWX.Req&req&=&new&SendMessageToWX.Req();&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&req.transaction&=&String.valueOf(videoB.getId()&+&System.currentTimeMillis());&&
&&&&&&&&&&&&&&&&req.message&=&wxM&&
&&&&&&&&&&&&&&&&req.scene&=&friendsCircle&?&SendMessageToWX.Req.WXSceneTimeline&:&SendMessageToWX.Req.WXSceneS&&
&&&&&&&&&&&&&&&&wxAPI.sendReq(req);&&
&&&&&&&&&&&&}&&
&&&&&&&&}).start();&&
&&&&private&class&LoadPicThread&extends&Thread{&&
&&&&&&&&private&String&&&
&&&&&&&&private&Handler&&&
&&&&&&&&public&LoadPicThread(String&url,Handler&handler){&&
&&&&&&&&&&&&this.url=&&
&&&&&&&&&&&&this.handler=&&
&&&&&&&&}&&
&&&&&&&&&&
&&&&&&&&@Override&&
&&&&&&&&public&void&run(){&&
&&&&&&&&&&&&try&{&&
&&&&&&&&&&&&&&&&URL&picurl&=&new&URL(url);&&&
&&&&&&&&&&&&&&&&HttpURLConnection&conn&=&(HttpURLConnection)picurl.openConnection();&
&&&&&&&&&&&&&&&&conn.setConnectTimeout(6000);
&&&&&&&&&&&&&&&&conn.setDoInput(true);&&&
&&&&&&&&&&&&&&&&conn.setUseCaches(false);
&&&&&&&&&&&&&&&&conn.connect();&&
&&&&&&&&&&&&&&&&Bitmap&bmp=BitmapFactory.decodeStream(conn.getInputStream());&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&ByteArrayOutputStream&output&=&new&ByteArrayOutputStream();&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&pressFormat.JPEG,&100,&output);&&
&&&&&&&&&&&&&&&&int&options&=&100;&&
&&&&&&&&&&&&&&&&while&(output.toByteArray().length&&&IMAGE_SIZE&&&&options&!=&10)&{&&&
&&&&&&&&&&&&&&&&&&&&output.reset();&&
&&&&&&&&&&&&&&&&&&&&pressFormat.JPEG,&options,&output);
&&&&&&&&&&&&&&&&&&&&options&-=&10;&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&bmp.recycle();&&
&&&&&&&&&&&&&&&&byte[]&result&=&output.toByteArray();&&
&&&&&&&&&&&&&&&&output.close();&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&Message&message=handler.obtainMessage();&&
&&&&&&&&&&&&&&&&message.obj=&&
&&&&&&&&&&&&&&&&message.sendToTarget();&&
&&&&&&&&&&&&}&catch&(Exception&e)&{&&
&&&&&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&public&boolean&isWXAppInstalled(){&&
&&&&&&&&return&wxAPI.isWXAppInstalled();&&
&&&&public&void&wxPay(final&BaseActivity&activity,String&order_id,String&payType){&&
&&&&&&&&activity.showProgress("");&&
&&&&&&&&ControllerFactory.getWalletsController().getPayments(order_id,&payType,&new&RequestDataCallback&PaymentsP&()&{&&
&&&&&&&&&&&&@Override&&
&&&&&&&&&&&&public&void&dataCallback(PaymentsP&obj)&{&&
&&&&&&&&&&&&&&&&if(checkCallbackData(obj,&true)){&&
&&&&&&&&&&&&&&&&&&&&if(obj.getError()==obj.ErrorNone){&&
&&&&&&&&&&&&&&&&&&&&&&&&PayReq&req&=&new&PayReq();
&&&&&&&&&&&&&&&&&&&&&&&&req.appId&=&obj.getAppid();&&
&&&&&&&&&&&&&&&&&&&&&&&&req.nonceStr=obj.getNoncestr();&&
&&&&&&&&&&&&&&&&&&&&&&&&req.packageValue=obj.getPackage_value();&&
&&&&&&&&&&&&&&&&&&&&&&&&req.sign=obj.getSign();&&
&&&&&&&&&&&&&&&&&&&&&&&&req.partnerId=obj.getPartnerid();&&
&&&&&&&&&&&&&&&&&&&&&&&&req.prepayId=obj.getPrepayid();&&
&&&&&&&&&&&&&&&&&&&&&&&&req.timeStamp=obj.getTimestamp();&&
&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&wxAPI.registerApp(obj.getAppid());&&
&&&&&&&&&&&&&&&&&&&&&&&&wxAPI.sendReq(req);&&
&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&MLog.i("ansen",&"开始进行微信支付..");&&
&&&&&&&&&&&&&&&&&&&&&&&&iView.showToast("开始进行微信支付..");&&
&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&}else{&&
&&&&&&&&&&&&&&&&&&&&iView.showToast(obj.getError_reason());&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&activity.hideProgress();&&
&&&&&&&&&&&&}&&
&&&&&&&&});&&
微信登陆以及分享 请求跟返回值的接收 & 我这边登陆.分享的状态都是发送广播出去,然后结束当前的Activity.
public&class&WXEntryActivity&extends&Activity&implements&IWXAPIEventHandler{&&
&&&&private&IWXAPI&wxAPI;&&
&&&&@Override&&
&&&&protected&void&onCreate(Bundle&savedInstanceState)&{&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&if(MLog.debug)&&
&&&&&&&&&&&&System.out.println("WXEntryActivity&onCreate");&&
&&&&&&&&&&
&&&&&&&&wxAPI&=&WXAPIFactory.createWXAPI(this,WeiXinPresenter.APP_ID,true);&&
&&&&&&&&wxAPI.registerApp(WeiXinPresenter.APP_ID);&&
&&&&&&&&&&
&&&&&&&&wxAPI.handleIntent(getIntent(),&this);&&
&&&&@Override&&
&&&&protected&void&onNewIntent(Intent&intent){&&
&&&&&&&&super.onNewIntent(intent);&&
&&&&&&&&wxAPI.handleIntent(getIntent(),this);&&
&&&&&&&&if(MLog.debug)&&
&&&&&&&&&&&&System.out.println("WXEntryActivity&onNewIntent");&&
&&&&@Override&&
&&&&public&void&onReq(BaseReq&arg0)&{&&
&&&&&&&&if(MLog.debug)&&
&&&&&&&&&&&&System.out.println("WXEntryActivity&onReq:"+arg0);&&
&&&&&&&&if(MLog.debug)&&
&&&&&&&&&&&&Toast.makeText(this,&"onReq&方法运行",&0).show();&&
&&&&@Override&&
&&&&public&void&onResp(BaseResp&resp){&&
&&&&&&&&MLog.d("ansen",&"onResp.....");&&
&&&&&&&&if(MLog.debug)&&
&&&&&&&&&&&&Toast.makeText(this,"onResp&方法运行",&0).show();&&
&&&&&&&&if(resp.getType()==MAND_SENDMESSAGE_TO_WX){
&&&&&&&&&&&&switch&(resp.errCode){&&
&&&&&&&&&&&&case&BaseResp.ErrCode.ERR_OK:&&
&&&&&&&&&&&&&&&&&&&&if(MLog.debug)&&
&&&&&&&&&&&&&&&&&&&&&&&&Toast.makeText(WXEntryActivity.this,&"分享成功!",&Toast.LENGTH_SHORT).show();&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&case&BaseResp.ErrCode.ERR_USER_CANCEL:&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&case&BaseResp.ErrCode.ERR_AUTH_DENIED:&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&Intent&intent&=&new&Intent();&&
&&&&&&&&&&&&intent.setAction(APIDefineConst.BROADCAST_ACTION_WEIXIN_SHARE);&&
&&&&&&&&&&&&&&&&LocalBroadcastManager&lbm&=&LocalBroadcastManager.getInstance(this);&&
&&&&&&&&&&&&&&&&lbm.sendBroadcast(intent);&&
&&&&&&&&}else&if(resp.getType()==MAND_SENDAUTH){
&&&&&&&&&&&&&&&&SendAuth.Resp&authResp&=&(Resp)&&&
&&&&&&&&&&&&String&code&=&authResp.&&
&&&&&&&&&&&&Intent&intent&=&new&Intent();&&
&&&&&&&&&&&&intent.setAction(APIDefineConst.BROADCAST_ACTION_WEIXIN_TOKEN);&&
&&&&&&&&&&&&intent.putExtra("errCode",&authResp.errCode);&&
&&&&&&&&&&&&if&(authResp.errCode&==&BaseResp.ErrCode.ERR_OK){
&&&&&&&&&&&&&&&&&&&&intent.putExtra("code",&code);&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&if(MLog.debug)&&
&&&&&&&&&&&&&&&&&&&&Toast.makeText(this,&"WXEntryActivity&发送登陆广播!!!!",&0).show();&&
&&&&&&&&&&&&&&&&if&(android.os.Build.VERSION.SDK_INT&&=&12)&{&&
&&&&&&&&&&&&&&&&&&&&&intent.setFlags(32);
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&LocalBroadcastManager&lbm&=&LocalBroadcastManager.getInstance(this);&&
&&&&&&&&&&&&&&&&lbm.sendBroadcast(intent);&&
&&&&&&&&}&&
&&&&&&&&finish();&&
微信支付 请求跟返回值的接收 & 微信支付也是发送广播,如果你们还有需求判断支付成功或者失败,可以在广播的intent中进行传参
public&class&WXPayEntryActivity&extends&Activity&&implements&IWXAPIEventHandler{&&
&&&&private&IWXAPI&wxAPI;&&
&&&&@Override&&
&&&&protected&void&onCreate(Bundle&savedInstanceState)&{&&
&&&&&&&&super.onCreate(savedInstanceState);&&
&&&&&&&&wxAPI&=&WXAPIFactory.createWXAPI(this,&WeiXinPresenter.APP_ID);&&
&&&&&&&&wxAPI.handleIntent(getIntent(),&this);&&
&&&&@Override&&
&&&&protected&void&onNewIntent(Intent&intent){&&
&&&&&&&&super.onNewIntent(intent);&&
&&&&&&&&setIntent(intent);&&
&&&&&&&&wxAPI.handleIntent(intent,&this);&&
&&&&@Override&&
&&&&public&void&onReq(BaseReq&arg0)&{&&
&&&&@Override&&
&&&&public&void&onResp(BaseResp&resp)&{&&
&&&&&&&&MLog.i("微信支付回调..",&"ansen&onResp");&&
&&&&&&&&if&(resp.getType()&==&MAND_PAY_BY_WX){
&&&&&&&&&&&&if(resp.errCode==BaseResp.ErrCode.ERR_OK){
&&&&&&&&&&&&&&&&Intent&intent&=&new&Intent();&&
&&&&&&&&&&&&&&&&intent.setAction(APIDefineConst.BROADCAST_ACTION_WEIXIN_PAY);&&
&&&&&&&&&&&&&&&&&&&&LocalBroadcastManager&lbm&=&LocalBroadcastManager.getInstance(this);&&
&&&&&&&&&&&&&&&&&&&&lbm.sendBroadcast(intent);&&
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&}else{&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&&&&&finish();&&
强调一点,一定要注意&接收微信的请求及返回值 的包名跟类名,包名是应用程序的包名+".wxapi" &类名必须是微信指定的类名 & 并且这两个Activity一定要在AndroidManifest.xml中注册,上传一张是我做的app中包名跟类名的截图
如何在activity中调用微信登陆
1).登陆广播监听内部类 &如果接收到了广播就去获取微信token
private&class&WXEntryReceiver&extends&BroadcastReceiver&{&&
&&&&@Override&&
&&&&public&void&onReceive(Context&context,&Intent&intent){&&
&&&&&&&&MLog.i("WXEntryReceiver",&"接收微信登陆广播");&&
&&&&&&&&if(MLog.debug)&&
&&&&&&&&&&&&showToast("接收微信登陆广播");&&
&&&&&&&&if(intent.getAction().equals(APIDefineConst.BROADCAST_ACTION_WEIXIN_TOKEN)){&&
&&&&&&&&&&&&int&errCode&=&intent.getExtras().getInt("errCode");&&
&&&&&&&&&&&&if(MLog.debug)&&
&&&&&&&&&&&&&&&&System.out.println("获取错误码:"+errCode);&&
&&&&&&&&&&&&if(errCode==BaseResp.ErrCode.ERR_USER_CANCEL||errCode==BaseResp.ErrCode.ERR_AUTH_DENIED){&&
&&&&&&&&&&&&&&&&requestDataFinish();&&
&&&&&&&&&&&&}else{&&
&&&&&&&&&&&&&&&&String&code&=&intent.getExtras().getString("code");&&
&&&&&&&&&&&&&&&&xinTestPresenter.getAccessToken(code);&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
2).定义成员变量
private&WXEntryReceiver&wxEntryReceiver=&&
3).在oncreate中注册广播
wxEntryReceiver=&new&WXEntryReceiver();&&
LocalBroadcastManager&lbm&=&LocalBroadcastManager.getInstance(this);&&
IntentFilter&filter&=&new&IntentFilter();&&
filter.addAction(APIDefineConst.BROADCAST_ACTION_WEIXIN_TOKEN);&&
lbm.registerReceiver(wxEntryReceiver,filter);&&
4).调用微信登陆
WeiXinPresenter&xinTestPresenter=new&WeiXinPresenter(this);&&
xinTestPresenter.login();&&
在Activity中调用微信分享跟调用微信支付的代码我就不贴出来了,我这篇博客只是给大家一个参考的地方,遇到问题还是建议第一时间看官方文档.说说我在做微信登陆碰到的问题
1.微信登陆、分享、支付 & &回调的activity & &包名跟类名一定要严格按照要求去写
2.接收回调的是activity &一定要在AndroidManifest.xml中注册
3.WeiXinPresenter中有两个常量 &&APP_ID跟SECRET &要去微信申请的时候才有的.你们copy代码的时候要给这两个常量赋值
4.可能访问网络神马的还需要一些权限 & 记得在AndroidManifest.xml添加权限
5.调用微信的登陆、分享、支付 & 你的安装包一定要有签名,签名信息一定要跟你在微信官网上申请时签名信息一致
6.微信没有客服支持。。。。。如果出了问题看官方demo & 或者 官方API
7.微信sdk经常升级,如果你开发的时候有最新的就用最新的吧.....
说了那么多,感觉说了一大堆废话......希望能帮到大家....有神马问题可以给我留言....推荐下自己创建的android QQ群:&欢迎大家的加入.我在csdn上上传了一个微信sdk的jar包,有需要的可以去
如果你想第一时间看我们的后期文章,扫码关注公众号,每个周末都会推送Android开发实战教程一篇,其余时间我们会推出一些互联网行业新闻,你还等什么,赶快关注吧,既能学到技术,还能长逼格,出任ceo,赢取白富美。。。。。&
阅读(...) 评论()Android快速实现微信支付(真的!很快!) - 简书
Android快速实现微信支付(真的!很快!)
本文为 Marno 原创,转载必须保留出处!
公众号【 aMarno 】,关注后回复 RN 加入交流群
React Native 优秀开源项目大全:
如果你已经成功集成了微信登录和分享,那么此文将助你快速集成微信支付,此文基于微信支付SDK3.1.1,也就是目前为止最新的SDK
不过我相信,即便你看了微信的官方文档,你依然不知道微信支付怎么集成,因为微信支付的官方文档简直太.....
如果你已经准备好了资源包,接下来正式开始集成
我们需要的资源其实有以下几样,在开始前,就这些转备好吧1)微信支付的APPID2)微信支付依赖包 &&& libammsdk.jar3)一个Activity类 &&& WXPayEntryActivity.java
这里需要特别说明一下,这个Activity类,直接从上下载到的范例代码中copy到自己的工程中即可,这个页面是在你调起微信支付完成支付(或取消或失败)后,再回到你的App时会调用的一个页面。页面的布局可以是你自定义的布局,直接放图讲解:
先说一下这个类的路径,网上也有一大堆介绍了,我直接放图,路径一定,而且必须是这样的:
WXPayEntryActivity 的路径
在这个类中需要注意的地方有两个:1、这个类中的布局是可以自定义的,如果你不需要展示什么布局,而是要跳转页面,把这段代码删除即可
回调页面的布局
2、回调结果的处理,下面是官方的处理方式,直接给了一个dialog,很多人会摸不着头脑,如果你不需要这个dialog,直接删除就好了,不需要把官方demo中的布局和资源都复制过来
官方的处理方式
下面是我自定义的处理方式,比较简单,就是土司显示了一下支付结果,如果你需要支付成功后跳转,那么直接在这里startActivity即可,别忘记最后要将这个页面finish()
自定义的处理方式
这个类中的其余的回调方法,我们都不需要去操作
然后我们就可以开始支付了,支付很简单,真的很简单
这是微信支付需要我们携带的参数,对于新人来说,可能比较困惑的是我怎么生成这些参数呢?其实这些参数都是服务器返回给我们的,APPID我们可以自己保存在本地一份,其余的都是服务器返回给我们的,大概介绍一下流程:
发起支付的流程,提交订单的时候的参数根据项目需要配置
最后,服务器返回给我们微信支付的参数后,我们就可以愉快的支付了,这里是关键一步,注意!!
发起支付的关键步骤
至此我们已经可以调起微信支付页面来支付了最后还有一个需要注意的是,很多人被这一步坑了,就是关于微信开放平台签名的问题。其实只要你手机上的程序的签名和你在微信平台登记的签名一致即可,无论是debug版本,还是release版本
微信开放平台签名
为了方便测试,我暂时填写的是我debug的签名,当然这个是可以改的,修改后会有审核期,几天就不知道,有时会很快,当应用快上线之前,记得去改为正式的签名即可,修改次数我也不知道了,可以自行百度一下!
● 公众号:Marno
● 个人站:
● 专注分享 React Native 技术和资源Android接入微信支付完全解析,太全了~
今天来聊聊,android中接入微信支付的需求,肯定有人会说,这多简单呀,还在这里扯什么,赶快去洗洗睡吧~~
那我就不服了,要是说这简单的,你知道微信支付官网多少吗,要是你一百度,下面全是广告,哈哈,你一不小心就掉坑去了,在简单的事,只要你想把他做好,其实也是很复杂的~
首先我们来到瞅瞅:
可以看到这就是微信支付首页,下面有几种支付方式,而我们今天的主角就是APP支付,我们可以直接点进去,或者从左上角接入指引-APP支付,进去的文档式样的,如下图所示:
vc3qs8nWp7i2vdPI69Do0qrExNCpsr3W6KOsxMTQqdfKwc+jrNXi0fnE47/J0tTIw8/gudi1xMjL1LHKws/IyKXXvLG41eLQqdfKwc+jrLb4srvKx8zuzerSu7K918rBz6Os1NrIpdXSz8LSu7K918rBz6OsvMfXocqxvOS+zcrHvfDHrqOswe3N4sTjwey1vMu1wLS4+M7SvbK9ss6i0MXWp7i2xMfXvLG4xMTQqdfKwc+jrMTjw7u/tLn91eLOxLW1o6zEx87Svs3Wu8Tcuse6x8HLTyihyV+hySlPfqGjwe3N4sTE0KnLtdanuLa88rWltcSjrNPQvLi49taqtcDV4tXFzbyjrNPW09DLrcjP1ea/tLn9fn48L3A+Cgo8cD6/ydLUv7S1vcrH0qq80zMwML/ptcSjrLu50OjSqsbz0rW1xNK70KnXysHPoaM8L3A+Cgo8cD7B7c3izqLQxdanuLbT0MG9uPbGvcyot9ax8MrHPGEgaHJlZj0="https://open./">开发者平台和
开发者平台:主要是针对开发者,比如:创建应用,获取appid
商户平台:主要是商户上面的一些管理,比如:可以查看流水,订单呀
这里我只是演示怎么创建应用,最后不会用这个账号的,因为我这是个人账号,没法申请支付,只是给不会创建的朋友做一个演示,需要哪些资料而已,会的可略过~
首先我们来到,没有账号的先注册,这个我想不用演示了,直接演示怎么创建应用,首先你的登录完账号,点击管理中心-移动应用:
点击左上角的创建移动应用,到如下界面,因为这里是测试,所有资料都是随便填啦
点击下一步就来到了
这一步让你填写,需要的平台,以及平台信息,我这里只悬着android,填入包名和签名,另外这里他没有想微博那样可以填入多个签名,那么这里我建议你一开始填入debug的签名,等调试通过了在填写正式签名,签名的获取方法和接入第三方登录是一样的。最后提交审核,等审核完以后,我们点击到应用详情,应该是这样的效果
个人账号创建的应用审核通过后只有,分享功能,如果还需要支付,可以点击申请,然后认证账号并上传一些资料,这又是一个漫长的过程,这里我们就不了那么多了,现在直接说怎么在代码实现吧
运行官方demo
记住这里的支付demo是在商户平台的帮助里面下载,,而不是开发者平台下载的那个demo(以前是可以,现在这里下载的demo,里面剔除了支付),如下图,是这个页面:
第一个是基础库,点击后会跳到开发者平台,第二个参数支付demo,当然里面也包含了分享等一些功能,可以说如果你既要做支付又要做分享,那么你只需要这个一个demo就行了,当然还得需要我这篇文章呀
下载完导入eclipse,替换debug.keystore然后运行,就可以看到如下界面,终于看到支付了,激动不已是不是
然后我们就可以点击“跳转到支付界面”,看看什么效果呀,是骡子是马总的溜溜吧,看到这一面,感觉神清气爽,因为demo跑通了,呵呵~
demo也看了,钱也付了,那我们现在就该开始接入支付了
正式接入支付
首先还是得上一张流程图呀,不然你知道怎么个逻辑?
这是这个文档的
,这是官方的解释
商户和微信支付系统主要交互说明:
步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。
步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明】
步骤5:商户后台接收支付通知。api参见【支付结果通知API】
步骤6:商户后台查询支付结果。,api参见【查询订单API】
首要微信支付暴露给我的是两步,一步是生成预支付订单,然后那个预支付订单id再去调用微信支付,所以说这里就有两种实现方式了,一种是客户端处理这所有步骤,另外一种肯定是服务端创建与支付订单和签名,然后返回给我们,我们才拿着这些参数去调用微信支付。实际应用中,推荐使用服务那种,但是我这里讲的是本地怎么实现支付,如果你们是在服务端支付,那么你的告诉他你需要什么参数,他怎么创建预支付订单等
这是,另外这里由于我没有可用的支付所以,写demo我用的包名和key都是微信demo的
配置activity
配置回调activity
public void testWxPay(View view) {
new Thread(new Runnable() {
public void run() {
String url = "http://wxpay./pub_v2/app/app_pay.php?plat=android";
ToastUtil.shortToastInBackgroundThread(getActivity(), "获取订单中...");
byte[] buf = Util.httpGet(url);
if (buf != null && buf.length > 0) {
String content = new String(buf);
Log.e("get server pay params:", content);
JSONObject json = new JSONObject(content);
if (null != json && !json.has("retcode")) {
req = new PayReq();
//req.appId = "wxf8b4f85f3a794e77";
// 测试用appId
req.appId = json.getString("appid");
req.partnerId = json.getString("partnerid");
req.prepayId = json.getString("prepayid");
req.nonceStr = json.getString("noncestr");
req.timeStamp = json.getString("timestamp");
req.packageValue = json.getString("package");
req.sign = json.getString("sign");
req.extData = "app data"; // optional
ToastUtil.shortToastInBackgroundThread(getActivity(), "正常调起支付");
Log.d("PAY_GET", "返回错误" + json.getString("retmsg"));
ToastUtil.shortToastInBackgroundThread(getActivity(), "返回错误" + json.getString("retmsg"));
Log.d("PAY_GET", "服务器请求错误");
ToastUtil.shortToastInBackgroundThread(getActivity(), "服务器请求错误");
} catch (Exception e) {
Log.e("PAY_GET", "异常:" + e.getMessage());
ToastUtil.shortToastInBackgroundThread(getActivity(), "异常:" + e.getMessage());
}).start();
private void toPay() {
// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
api.sendReq(req);
到这里如果你按照我的配置的话,正常情况下试可用调起支付界面了,如果出现-1,请检查是不是替换了debug.keystore,如果替换了,还是这样记得清空微信缓存
以上测试代码都在上,官方的下载的sdk包也在该仓库的docs目录下
如果我的文章对来带来的帮助,可加我微信,微博,QQ什么啥的交个朋友也是不错的,另外微信,微博都会不定期发一些优质的文章,感谢大家的支持~~,联系方式在我的个人介绍里啦

我要回帖

更多关于 android 微信sdk登录 的文章

 

随机推荐