签名及拿到签名结果

1、组装待签名字符串

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&notify_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

2、调用签名函数

1)MD5签名

  • 密钥获取:
    查看MD5(Key)
  • 密钥用法:
    把MD5密钥(Key)拼接在待签名字符串尾部。
  • 签名函数
    调用md5加密函数,对已经与MD5密钥拼接好的新字符串做加密运算。

2)RSA或DSA签名

  • 密钥生成:
    请查看:PID和密钥管理中相应的内容
  • 密钥用法:
    准备好支付宝公钥、商户自己生成的私钥、待签名字符串。
  • 签名函数
    调用RSA或DSA加密函数,分别把商户自己生成的私钥、待签名字符串置入函数中得到签名结果。

3、签名结果的用途

得到的签名结果也是一串字符串,这串字符串便是sign参数的值,把这串字符串赋值于sign参数。

onlineServer