安卓微信支付遇到的问题及解决办法

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_21402513/article/details/51906411

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"





展开阅读全文

安卓 微信支付code=-1 问题

11-26

本人在做项目涉及到微信支付,已经卡住一天了,本人确定使用微信提供的签名获取工具获取到的应用签名与微信开放平台上的app签名是一致的,测试前,是将微信卸载掉重装过的,包括换手机,但是实验结果依旧是支付失败,code= -1。项目中,appId,partnerId,prepayId,nonceStr,sign均由服务端提供,ios版本没有问题,安卓版本则一直返回code=-1 ,求各路大神帮忙出计献策。rn代码如下:rnpublic class WechatPay rn private IWXAPI msgApi = null;rn private Context mContext;rn private PayReq req;rnrnrn public WechatPay(Context context) rn mContext = context;rn req = new PayReq();rn rnrn public void payByWechat(WeChatPayModel weChatPayModel) rn genPayReq(weChatPayModel);rn msgApi = WXAPIFactory.createWXAPI(mContext.getApplicationContext(), weChatPayModel.getAppid(), false);rn msgApi.registerApp(req.appId);rn msgApi.sendReq(req);rn rn //WeChatPayModel为自己定义的一个实体类,包括: Appid,MchId,PrepayId,NonceStr,Sign,由服务端提供数据。rn private void genPayReq(WeChatPayModel weChatPayModel) rnrn req.appId = weChatPayModel.getAppid();rn req.partnerId = weChatPayModel.getMchId();rn req.prepayId = weChatPayModel.getPrepayId();rn req.packageValue = "Sign=WXPay";rn req.nonceStr = weChatPayModel.getNonceStr();rn req.timeStamp = String.valueOf(genTimeStamp());rn req.sign = weChatPayModel.getSign();rn rnrn private long genTimeStamp() rn return System.currentTimeMillis() / 1000;rn rn 论坛

没有更多推荐了,返回首页