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

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"





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值