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

来源:互联网 发布: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"





0 0
原创粉丝点击