1)筛选
大部分支付宝接口中要剔除sign_type、sign两个参数,个别接口只剔除sign参数。
存在空值的参数必须剔除。
如:
Map<String, String> sParaTemp = new HashMap<String, String>(); sParaTemp.put("service", "create_direct_pay_by_user"); sParaTemp.put("partner", "2088501624560335"); sParaTemp.put("_input_charset", "utf-8"); sParaTemp.put("payment_type", "1"); sParaTemp.put("notify_url", "http://商户网关地址/alipay/notify_url.jsp"); sParaTemp.put("return_url", "http://商户网关地址/alipay/return_url.jsp"); sParaTemp.put("seller_email", "alipayrisk10@alipay.com"); sParaTemp.put("out_trade_no", "2012113000001"); sParaTemp.put("subject", "测试订单"); sParaTemp.put("total_fee", "0.01"); |
2)排序
在参数集合中,根据参数(不是参数对应的值)的第一个字符的键值ASCII码递增排序,如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。
如:
Map<String, String> sParaTemp = new HashMap<String, String>(); sParaTemp.put("_input_charset", "utf-8"); sParaTemp.put("notify_url", "http://商户网关地址/alipay/notify_url.jsp"); sParaTemp.put("out_trade_no", "2012113000001"); sParaTemp.put("partner", "2088501624560335"); sParaTemp.put("payment_type", "1"); sParaTemp.put("return_url", "http://商户网关地址/alipay/return_url.jsp"); sParaTemp.put("seller_email", "alipayrisk10@alipay.com"); sParaTemp.put("service", "create_direct_pay_by_user"); sParaTemp.put("subject", "测试订单"); sParaTemp.put("total_fee", "0.01"); |
3)拼接
在参数集合中,把每个参数及其值组合成“参数=参数值”的格式(在无线产品手机安全支付中,每个参数的组合格式是“参数="参数值"”),并且把这些参数用&字符连接起来,如:
_input_charset=utf-8¬ify_url=http://商户网关地址/alipay/notify_url.jsp&out_trade_no=2012113000001&partner= 2088501624560335&payment_type=1&return_url=http://商户网关地址/alipay/return_url.jsp&seller_email=alipayrisk10@alipay.com& service=create_direct_pay_by_user&subject=测试订单&total_fee=0.01 |
1)MD5签名
2)RSA或DSA签名
得到的签名结果也是一串字符串,这串字符串便是sign参数的值,把这串字符串赋值于sign参数。