最近在做支付宝APP的集成,遇到了一堆问题。百度不到,ALI64还好点,ALI38173基本上就没了。
我也是测试了很久才解决的。
ALI64的解决方案是因为要对私钥有问题。
ALI38173是签名有问题。
签名的解决方案是对URL里所有的值都加上双引号,然后再进行RSA的加密签名。
最后签名需要用URLEncoder进行编码一下
最后生成的结果像下面这样的
复制
body="test"&_input_charset="UTF-8"&it_b_pay="1d"&total_fee="1"&subject="test"¬ify_url="http://www.bejson.com/api/alipay/testpayotify.php"&service="mobile.securitypay.pay"&seller_id="cw@bejson.com"&partner="2088301"&out_trade_no="2088301971894011"&payment_type="1"&show_url="http://www.dcloud.io/helloh5/"&sign="RtUKAGMfelb5sl2az4YKhxst051l94FSkpk9xoD91Hbpr2PKnWjHIafTWqNLyxGibde%2BKwcq9Y8cDN0qU%2FsO6hXjch0B4GaMJHBxZQM%2FnJK2YGxPPOWFKKL5rBKVJ%2BrX4OImfSQIyKKUpAEFG6uFfek2hh%2FPFJSXk2Phvmrb8U%3D"&sign_type="RSA"
java代码:
生成参数串:
复制
public static String createLinkString(Map<String, String> params) { List<String> keys = new ArrayList<String>(params.keySet()); String prestr = ""; for (int i = 0; i < keys.size(); i++) { String key = keys.get(i); String value = params.get(key); if (i == keys.size() - 1) {//拼接时,不包括最后一个&字符 prestr = prestr + key + "="" + value+"""; } else { prestr = prestr + key + "="" + value +"""+ "&"; } } return prestr;}
根据参数传生成签名串,这里的privateKey是进行pkcs8格式转换后取出首尾、空格换行后的字符串:
复制
public static String sign(String content, String privateKey) { try { PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec( Base64.decode(privateKey)); KeyFactory keyf = KeyFactory.getInstance(ALGORITHM); PrivateKey priKey = keyf.generatePrivate(priPKCS8); java.security.Signature signature = java.security.Signature .getInstance(SIGN_ALGORITHMS); signature.initSign(priKey); signature.update(content.getBytes(DEFAULT_CHARSET)); byte[] signed = signature.sign(); return Base64.encode(signed); } catch (Exception e) { e.printStackTrace(); } return null;}