安卓微信支付遇到的问题及解决办法
来源:互联网 发布:qq.com 域名 编辑:程序博客网 时间:2024/05/16 09:39
1、出现token为null的错误日志
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application。
首先token为null,一定要明确是哪里的token,(我一直以为这里是要我没有调微信的接口获得accessToken所以为空)然而这里异常的原因:AlertDialog创建语句public AlertDialog.Builder (Context context)中,不能使用getApplicationContext()得到的context,而必须使用Activity,所以解决如下
注意:getProductArgs()方法中获取第一次签名sign,是获取PackageSign,不是AppSign。
等到执行genPayReq()时获取第二次签名sign,获取的是AppSign。
String sign = genPackageSign(packageParams);packageParams.add(new BasicNameValuePair("sign", sign));//签名
request.sign = genAppSign(signParams);//签名sb.append("sign\n" + request.sign + "\n\n");
2、签名错误且prepay_id为空
在GetPrepayIdTask这个异步任务类里的doInbankground中需要getProductArgs()来拼接商品信息
private String genOutTradNo() { Random random = new Random(); return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());}
解决办法:当我把订单号的value改为随机获取订单号的方法时,签名就正确了,prepay_id也生成了。
3、在onPostExecute()获取到了prepay_id值,但没执行genPayReq()方法(考虑是否拼接出了问题)
问题解决:sb这个对象。。。没有初始化。。。。!!!!!!没有初始化!!!!
StringBuffer sb;private PayReq request;public WeChatPay(Context context, int mPrice, String mBody, String orderId, int type) { this.context = context; this.mPrice = mPrice; this.mBody = mBody; this.orderId = orderId; this.type = type; sb = new StringBuffer();}
ps: 我已经要哭了。。。对了request在外部调用pays()时在pays()方法里初始化的。。。
此时,genPayReq()已经执行,这个方法是用来获取二次签名sign。
4、依旧没有跳到支付界面!!!
发现执行了sendPayReq(),然后就没有下文了,这时就去查看问题日志,翻到这里发现说需要一个Theme.
且注意,msgApi的初始化及注册!!!
IWXAPI msgApi
public void pays() { this.msgApi = WXAPIFactory.createWXAPI(context, Contants.WEIXIN_APPID); boolean is = this.msgApi.isWXAppInstalled(); if (!is) { ToastUtil.showToast("您没有安装微信", context); } else { this.msgApi.registerApp(Contants.WEIXIN_APPID); WeChatPay.GetPrepayIdTask getPrepayId = new WeChatPay.GetPrepayIdTask(); getPrepayId.execute(); }}
解决办法:不要让WXPayEntryActivity继承自己的BaseActivity,而是让它extends Activity,且在配置文件中无需添加Theme的设置,即可。
上传部分代码,如下:
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); api = WXAPIFactory.createWXAPI(this, Contants.WEIXIN_APPID); api.handleIntent(getIntent(), this);}@Overrideprotected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); api.handleIntent(intent, this);}
5、依旧没有跳到支付界面!!!但是返回支付失败,返回-1。
在网上查了很多资料大多说是签名的问题,在我反复检查了几遍代码无误后,我估计真是签名的问题,然后具体后来怎么解决的就说来话长了。。反正呢,就是去微信申请APPID的Package一定要和你生成keystore的包名一致!!!!!然后就没啥问题了!
以上。
题外话:
packageValue参数一定要写成“Sign=WXPay"
- 安卓微信支付遇到的问题及解决办法
- 遇到的问题及解决办法
- 支付遇到的问题
- Webservice发布遇到的问题及解决办法
- 安装RMagick遇到的问题及解决办法
- Debian 遇到的问题及解决办法
- 常遇到的JCO问题及解决办法
- linux下组播遇到的问题及解决办法
- opengl 遇到的问题及解决办法 总结
- hadoop部署遇到的问题及解决办法
- centos遇到的问题及解决办法
- dbn_svr代码遇到的问题及解决办法
- linux遇到的一些问题及解决办法
- 升级Xcode7遇到的问题及解决办法
- Linux中遇到的问题及解决办法
- Latex中遇到的问题及解决办法
- 安装CocoaPods遇到的问题及解决办法
- 程序锁遇到的问题及解决办法
- 字符串的排列组合问题
- iOS 25个性能优化/内存优化常用方法
- define和defined区别
- lower_bound()返回值
- CDH5: 使用parcels配置lzo
- 安卓微信支付遇到的问题及解决办法
- oracle基础教程:数据库的范式
- 字符串和数字相互转换
- x265 2.0版本更新
- IOS中NSUserDefaults的用法(轻量级本地数据存储)
- UVA-10115 Automatic Editing
- 跨平台之AppCan与DeviceOne对比点评记录
- STL的东西好多好杂呀~
- Java序列化与反序列化