一、前言
吐槽一下,微信支付的sdk真难用,文档混乱,坑不少。
二、可能引起这种情况的问题
1. 极小概率
你的APPID和商户号写错了。appid是你open.里你设置的应用的id。
2. 极大概率
你应用的签名弄错了,这里坑比较多。
当你直接用AndroidStudio调试,在手机上直接Run的时候,用给的那个签名软件,获取到签名更新到你应用信息的这里:
当你在另外一台电脑上调试的时候,你的应用的签名其实是会改变的,所以用那个签名软件,获取到签名后,再次更新到你的应用的信息里。当你的APP开发的差不多了,需要发布(Generate Signed APK)时,先安装到一台手机上,然后获取签名,再次更新到你的应用的信息里。
3. 较大概率
其实这个具体是怎么引起的我也不知道,有时候你重启下手机或者清理下微信的缓存,就会发现,竟然能调起来微信了。对,就是这么神奇!!
三、可能对你有些帮助的
在下面的代码中通过查看request.checkArgs()
和api.sendReq(request)
的返回值,帮助你定位错误。
我的代码提供参考
public void onClick(View view) {Unifiedorder unifiedorder = new Unifiedorder();final SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();parameters.put("appid", ConstantStrings.APP_ID);unifiedorder.setAppid(ConstantStrings.APP_ID);parameters.put("mch_id", ConstantStrings.MCH_ID);unifiedorder.setMch_id(ConstantStrings.MCH_ID);//获取随机数的方法String nonce_str = Utils.getNonce_str();parameters.put("nonce_str", nonce_str);unifiedorder.setNonce_str(nonce_str);parameters.put("body", "weimabang shopping");//not support cn-zhunifiedorder.setBody("weimabang shopping");//order_id就是订单号parameters.put("out_trade_no", "0405120603");//我这里的订单号只是举个例子,不要一直用这一个,千万不能写死unifiedorder.setOut_trade_no("0405120603");//我这里的订单号只是举个例子,不要一直用这一个,千万不能写死//总金额parameters.put("total_fee", 1);//单位是分unifiedorder.setTotal_fee("1");//ip地址parameters.put("spbill_create_ip", "123.123.123.123");unifiedorder.setSpbill_create_ip("123.123.123.123");//支付成功的回调地址String notify_url = "";parameters.put("notify_url", notify_url);unifiedorder.setNotify_url(notify_url);parameters.put("trade_type", "APP");unifiedorder.setTrade_type("APP");//方法生成的sign值String sign = Utils.createSign(parameters);unifiedorder.setSign(sign);OkHttpUtils.postString().content(XMLHelper.getXMLFromUnifiedorder(unifiedorder)).url(ConstantStrings.UNIFORMORDERURL).build().execute(new StringCallback() {@Overridepublic void onError(Call call, Exception e) {}@Overridepublic void onResponse(Call call, String s) {//返回值//Toast.makeText(PayActivity.this, s, Toast.LENGTH_LONG).show();int startIndex=s.indexOf("prepay_id");startIndex=s.indexOf("wx",startIndex);int endIndex=s.indexOf("]",startIndex);String prepayID=s.substring(startIndex,endIndex);Log.d("jim","data is "+s);Log.d("jim","prepay id is "+prepayID);String nonceStr=Utils.getNonce_str();String timeStamp=System.currentTimeMillis()/1000+"";final SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();parameters.put("appid",ConstantStrings.APP_ID);parameters.put("partnerid",ConstantStrings.MCH_ID);parameters.put("prepayid",prepayID);parameters.put("package","Sign=WXPay");parameters.put("noncestr",nonceStr);parameters.put("timestamp",timeStamp);String sign=Utils.createSign(parameters);IWXAPI api= WXAPIFactory.createWXAPI(PayActivity.this,ConstantStrings.APP_ID);PayReq request=new PayReq();request.appId=ConstantStrings.APP_ID;request.partnerId = ConstantStrings.MCH_ID;request.prepayId= prepayID;request.packageValue = "Sign=WXPay";request.nonceStr= nonceStr;request.timeStamp= timeStamp;request.sign= sign;Log.d("jim","check args "+request.checkArgs());Log.d("jim","send return :"+api.sendReq(request));}});}