【Android】解决微信调起支付接口没反应,调不起来微信的问题
//#前言
吐槽一下,微信支付的sdk真难用,文档混乱,坑不少。
正文:可能引起这种情况的问题
1. 最不能出现的
你的APPID和商户号写错了。appid是你open.weixin.qq.com里你设置的应用的id。
2. 最可能出现的
你应用的签名弄错了,这里坑比较多。
* 当你直接用AndroidStudio调试,在手机上直接Run的时候,用给的那个签名软件,获取到签名更新到你应用信息的这里:
* 当你在另外一台电脑上调试的时候,你的应用的签名其实是会改变的,所以用那个签名软件,获取到签名后,再次更新到你的应用的信息里。
* 当你的APP开发的差不多了,需要发布(Generate Signed APK)时,先安装到一台手机上,然后获取签名,再次更新到你的应用的信息里。
3. 也有很大可能出现的
其实这个具体是怎么引起的我也不知道,有时候你重启下手机或者清理下微信的缓存,就会发现,竟然能调起来微信了。对,就是这么神奇!!
可能对你有些帮助的
在下面的代码中通过查看request.checkArgs())和api.sendReq(request)的返回值,帮助你定位错误。
我的代码提供参考
public void onClick(View view) { Unifiedorder unifiedorder = new Unifiedorder(); final SortedMap<Object, Object> parameters = new TreeMap<Object, Object>(); parameters.put("appid", ConstantStrings.APP_ID); unifiedorder.setAppid(ConstantStrings.APP_ID); parameters.put("mch_id", ConstantStrings.MCH_ID); unifiedorder.setMch_id(ConstantStrings.MCH_ID); //获取随机数的方法 String nonce_str = Utils.getNonce_str(); parameters.put("nonce_str", nonce_str); unifiedorder.setNonce_str(nonce_str); parameters.put("body", "weimabang shopping");//not support cn-zh unifiedorder.setBody("weimabang shopping"); //order_id就是订单号 parameters.put("out_trade_no", "20170405120603");//我这里的订单号只是举个例子,不要一直用这一个,千万不能写死 unifiedorder.setOut_trade_no("20170405120603");//我这里的订单号只是举个例子,不要一直用这一个,千万不能写死 //总金额 parameters.put("total_fee", 1);//单位是分 unifiedorder.setTotal_fee("1"); //ip地址 parameters.put("spbill_create_ip", "123.123.123.123"); unifiedorder.setSpbill_create_ip("123.123.123.123"); //支付成功的回调地址 String notify_url = "http://www.baidu.com"; parameters.put("notify_url", notify_url); unifiedorder.setNotify_url(notify_url); parameters.put("trade_type", "APP"); unifiedorder.setTrade_type("APP"); //方法生成的sign值 String sign = Utils.createSign(parameters); unifiedorder.setSign(sign); OkHttpUtils.postString().content(XMLHelper.getXMLFromUnifiedorder(unifiedorder)) .url(ConstantStrings.UNIFORMORDERURL).build().execute(new StringCallback() { @Override public void onError(Call call, Exception e) { } @Override public void onResponse(Call call, String s) { //返回值 //Toast.makeText(PayActivity.this, s, Toast.LENGTH_LONG).show(); int startIndex=s.indexOf("prepay_id"); startIndex=s.indexOf("wx",startIndex); int endIndex=s.indexOf("]",startIndex); String prepayID=s.substring(startIndex,endIndex); Log.d("jim","data is "+s); Log.d("jim","prepay id is "+prepayID); String nonceStr=Utils.getNonce_str(); String timeStamp=System.currentTimeMillis()/1000+""; final SortedMap<Object, Object> parameters = new TreeMap<Object, Object>(); parameters.put("appid",ConstantStrings.APP_ID); parameters.put("partnerid",ConstantStrings.MCH_ID); parameters.put("prepayid",prepayID); parameters.put("package","Sign=WXPay"); parameters.put("noncestr",nonceStr); parameters.put("timestamp",timeStamp); String sign=Utils.createSign(parameters); IWXAPI api= WXAPIFactory.createWXAPI(PayActivity.this,ConstantStrings.APP_ID); PayReq request=new PayReq(); request.appId=ConstantStrings.APP_ID; request.partnerId = ConstantStrings.MCH_ID; request.prepayId= prepayID; request.packageValue = "Sign=WXPay"; request.nonceStr= nonceStr; request.timeStamp= timeStamp; request.sign= sign; Log.d("jim","check args "+request.checkArgs()); Log.d("jim","send return :"+api.sendReq(request)); } }); }
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
android面试题
最近在准备android面试,整理了下相关的面试题,分为如下三个部分:android部分、Java部分、算法面试题,后续有新内容直接在对应的文章中补充。 android部分:本文 Java部分: https://www.jianshu.com/p/c2c8f5019c8f 算法部分: https://www.jianshu.com/p/d9bfc440ada3 0、android系统架构图 android架构(http://gityuan.com/) Android系统启动过程过程如下:Loder--Kernel--Native--FrameWork--App。 Loader层:分为Boot ROM和Boot Loader,其中Boot ROM是当手机处于关机状态时,长按Power键开机,引导芯片开始从固化ROM里的预设代码开始执行,然后加载引导程序到RAM;Boot Loader是启动Android系统之前的引导程序,主要是检查RAM,初始化应急参数等功能。 Kernel层:指的是android内核层,到这里才刚刚开始进入android系统。启动Kernel的Swapper进程,该进...
- 下一篇
16.源码阅读(View的绘制-android api-26)
今天带着一个问题来看Android View的绘制流程 View的绘制入口在哪? 很多时候,在进入到一个页面的时候,会需要动态的获取到布局中某一个view的宽度或者高度,但是我们发现如果直接在onCreate方法或者onResume方法中通过这种方式去取高度值得到的是0 int measuredHeight = mTextView.getMeasuredHeight(); 而调用post方法才可以得到正确的值 mTextView.post(new Runnable() { @Override public void run() { int measuredHeight1 = mTextView.getMeasuredHeight(); System.out.println("post measuredHeight:"+measuredHeight1); } }); 所以回到我们的第一个问题,view的绘制入口在哪里,只有view绘制完成经过测量才能得到宽高值,是否在onCreate和onResume方法中,view还没有完成绘制测量呢? 在Activity的启动流程中已经了解到,最终要...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS6,CentOS7官方镜像安装Oracle11G
- Windows10,CentOS7,CentOS8安装Nodejs环境