通常来讲这里的请求时由后台拼好给你的,但是你也可以自己拼。我这里说的是后台拼的情况。
1.看看你是否创建了一个wxapi的包,并在这个包下有WXPayEntryActivity类。
2.检查你的应用包名是否与申请开通支付时的包名一致。
3.如果包名一直,查看密钥是否一致,因为签名和不签名获取到的密钥是不一样的。
4.后台使用的api密钥是否正确,这里的api密钥不是AppSecret,是需要单独申请的。
5.请你的后台检查拼接字符时候的key值是否按照ascii码的顺序来的。
6.如果以上都是正常的那么就是sign的问题了,因为后台在发起微信支付的时候,也是要传sign给微信,而且微信也会返回sign给后台,有可能你的后台把微信给他的sign返回给你了;如果你拿着这个sign去请求是会一直返回-1的。
如果你需要在本地拼接sign字段,那么一下代码可能会帮助到你:
//字节数组转字符串 private static String byteArrayToHexString(byte b[]) { StringBuffer resultSb = new StringBuffer(); for (int i = 0; i < b.length; i++) resultSb.append(byteToHexString(b[i])); return resultSb.toString(); } //字节转字符 private static String byteToHexString(byte b) { int n = b; if (n < 0) n += 256; int d1 = n / 16; int d2 = n % 16; return hexDigits[d1] + hexDigits[d2]; } /** * md5加密 * @param origin 需要加密的字符串 * @param charsetname 字符编码 * @return 加密后的字符串 */ public static String MD5Encode(String origin, String charsetname) { String resultString = null; try { resultString = new String(origin); MessageDigest md = MessageDigest.getInstance("MD5"); if (charsetname == null || "".equals(charsetname)) resultString = byteArrayToHexString(md.digest(resultString .getBytes())); else resultString = byteArrayToHexString(md.digest(resultString .getBytes(charsetname))); } catch (Exception exception) { } return resultString; } //微信登陆本地签名 private String signNum(String partnerId,String prepayId,String packageValue,String nonceStr,String timeStamp,String key){ String stringA= "appid="+ APP_ID +"&noncestr="+nonceStr +"&package="+packageValue +"&partnerid="+partnerId +"&prepayid="+prepayId +"×tamp="+timeStamp; String stringSignTemp = stringA+"&key="+key; String sign = TipsUtils.MD5Encode(stringSignTemp,"utf-8"); return sign; } private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };