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 {
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); api = WXAPIFactory.createWXAPI(this, Contants.WEIXIN_APPID); api.handleIntent(getIntent(), this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); api.handleIntent(intent, this); }
5、依旧没有跳到支付界面!!!但是返回支付失败,返回-1。
在网上查了很多资料大多说是签名的问题,在我反复检查了几遍代码无误后,我估计真是签名的问题,然后具体后来怎么解决的就说来话长了。。反正呢,就是去微信申请APPID的Package一定要和你生成keystore的包名一致!!!!!然后就没啥问题了!
以上。
题外话:
packageValue参数一定要写成“Sign=WXPay"