1.首先如图如图先了解详细的基本流程。(https://docs.open.alipay.com/204/105297/)服务端:2,3,9,10步。
2.首先由客户端去支付宝申请沙箱,(开发者中心)(https://openhome.alipay.com/platform/appDaily.htm),申请完毕会看到如下:
之后会用到的数据有APPID,与支付宝公钥,以及支付宝网关
3. 下载RSA应用公钥与应用私钥生成软件https://docs.open.alipay.com/291/105971/
,然后生成公钥与私钥。将私钥按对应的生成方式RSA2或RSA,传入到沙箱环境。得到对应的支付宝公钥。
4.开始进行加签,这里所必要的参数为:(https://docs.open.alipay.com/204/105465)
Biz_content必要参数:
然后开始正式进行加签。
参数解析:app_id支付宝沙箱中的app_id
Method,format,Charset,sign_type,version:参考官方文档
Sign:
Timestamp:获得当前时间,转成官方文档的格式:YYYY-MM-DD HH:MM:ss
Notify_url:验签完,支付成功后支付宝调用的网址。(需要将这个网址配置到外网中,局域网不可以,并将这个具体网址的写入到加签时的那个请求参数中);
Biz_content:独立创建一个json对象,然后配置好之后再转换成json字符串格式。
具体参数:
1. subject:商品标题
2. out_trade_no:商户网站的唯一订单号,可以4位随机数+当前时间毫秒数(这里一定要每次不一样,不然支付成功一次之后,再次支付客户端会提示系统繁忙)
3. total_amont: 订单总金额
4. product_code:官方文档固定值
组合过程:最后组合成如下实例格式的待签名字符串:(如下支付宝官方示例:)
app_id=2015052600090779&biz_content={"timeout_express":"30m","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是测试数据","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http://domain.merchant.com/payment_notify&sign_type=RSA2×tamp=2016-08-2520:26:31&version=1.0
然后,先将其转换为数组,然后用sort(),方法进行自然排序,(貌似按字母开头排序a,b,c),
然后读取商户的应用私钥,(要转成pem文件,即将生成的txt文件的后戳名改为.pem,然后在private_key里的第一行加入 BEGIN PRIVATE KEY, 第二行为实际私钥,第三行ENDPRIVATE KEY ,【公钥的话将PRIVATE改为PUBLIC】)
Var sign =crypto.createSign("RSA-SHA256"); //创建一个编码方式
sign.update(content);//用这种编码方式修改排序后的待签名字符串(content)
sign.sign(privateKey, 'base64'); //用商户私钥进行加密,返回给我们真正的签名:sign
【这讲的模糊,反正就是这么整】
再将其与待签名字符串进行拼接,拼接格式依然为 aaa=111&bbb=222&ccc=333。
然后遍历新拼接好的数据,再将其先转为数组,然后用sort(),方法也进行自然排序,然后遍历所有的key-value值,将所有的value进行encodeURIComponent(value)编码一次【这是必须的】。再次拼接成(aaa=111&bbb=222&ccc=333)格式的字符串,然后将最终的字符串返回给前端。前端通过沙箱中的支付宝网关? + 最终字符串,得到支付宝返回的数据
5.验签
https://docs.open.alipay.com/200/106120
将前端返回的数据得到后:参数(param)实例格式如下
{"alipay_trade_precreate_response":{"code":"10000","msg":"Success","out_trade_no":"6141161365682511","qr_code":"https:\/\/qr.alipay.com\/bax03206ug0kulveltqc80a8"},"sign":"VrgnnGgRMNApB1QlNJimiOt5ocGn4a4pbXjdoqjHtnYMWPYGX9AS0ELt8YikVAl6LPfsD7hjSyGWGjwaAYJjzH1MH7B2/T3He0kLezuWHsikao2ktCjTrX0tmUfoMUBCxKGGuDHtmasQi4yAoDk+ux7og1J5tL49yWiiwgaJoBE="}
这里得到其,键: alipay_trade_precreate_response所对应的value。{"code":"10000","msg":"Success","out_trade_no":"6141161365682511","qr_code":"https:\/\/qr.alipay.com\/bax03206ug0kulveltqc80a8"} , 即是我们所需要待验签字符串。(如果是JSON格式,用strinfiy()方法将其转换为json字符串格式)。
然后用param得到加密方法,与签名。即sign_type,sign
再读取沙箱给的支付宝公钥,public_key
然后用这四项,value,sign,sign_type,public_key。进行验证签名
代码如下
Var verify;
verify.update(content);//content为value(待验签的数据)
verify.verify(publicKey, sign, 'base64')//验证签名,然后返回false,或者true。将其返回给客户端
参考文献:https://blog.csdn.net/njweiyukun/article/details/79478455