原文: 【Android】解决微信调起支付接口没反应,调不起来微信的问题
//#前言 吐槽一下,微信支付的sdk真难用,文档混乱,坑不少。
正文:可能引起这种情况的问题
1. 最不能出现的
你的APPID和商户号写错了。appid是你open.weixin.qq.com里你设置的应用的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 parameters = new TreeMap();
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" );
unifiedorder.setBody("weimabang shopping" );
parameters.put("out_trade_no" , "20170405120603" );
unifiedorder.setOut_trade_no("20170405120603" );
parameters.put("total_fee" , 1 );
unifiedorder.setTotal_fee("1" );
parameters.put("spbill_create_ip" , "123.123.123.123" );
unifiedorder.setSpbill_create_ip("123.123.123.123" );
String notify_url = "http://www.baidu.com" ;
parameters.put("notify_url" , notify_url);
unifiedorder.setNotify_url(notify_url);
parameters.put("trade_type" , "APP" );
unifiedorder.setTrade_type("APP" );
String sign = Utils.createSign(parameters);
unifiedorder.setSign(sign);
OkHttpUtils.postString().content(XMLHelper.getXMLFromUnifiedorder(unifiedorder))
.url(ConstantStrings.UNIFORMORDERURL).build().execute(new StringCallback() {
@Override
public void onError (Call call, Exception e) {
}
@Override
public void onResponse (Call call, String s) {
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 parameters = new TreeMap();
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));
}
});
}