【Vue+DRF生鲜电商】27.支付宝公钥,私钥,沙箱环境配置

专题:Vue+Django REST framework前后端分离生鲜电商

Vue+Django REST framework 打造前后端分离的生鲜电商项目(慕课网视频)。
Github地址:https://github.com/xyliurui/DjangoOnlineFreshSupermarket
Django版本:2.2、djangorestframework:3.9.2。
前端Vue模板可以直接联系我拿。

更多内容请点击 我的博客 查看,欢迎来访。

注册开放平台

访问支付宝开放平台 https://open.alipay.com/platform/home.htm ,右上角进入 管理中心

[外链图片转存失败(img-tvOxhcHD-1565442608659)(https://blog.starmeow.cn/media/blog/images/2019/08/BLOG_20190810_210747_47.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 “博客图集BLOG_20190810_210747_47.png”)]

企业账户才能创建应用,个人账户不行,但可以在沙箱中进行调试,这个应用是自动生成的

[外链图片转存失败(img-2JjJcZ9g-1565442608660)(https://blog.starmeow.cn/media/blog/images/2019/08/BLOG_20190810_210740_37.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 “博客图集BLOG_20190810_210740_37.png”)]

密钥生成步骤

查看密钥生成方法

[外链图片转存失败(img-TFocO0HB-1565442608661)(https://blog.starmeow.cn/media/blog/images/2019/08/BLOG_20190810_210731_91.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 “博客图集BLOG_20190810_210731_91.png”)]

可以访问 https://docs.open.alipay.com/291/105971 按步骤即可

下载 RSA签名验签工具windows,运行里面的 .bat 文件

[外链图片转存失败(img-b96h3JcO-1565442608661)(https://blog.starmeow.cn/media/blog/images/2019/08/BLOG_20190810_210724_71.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 “博客图集BLOG_20190810_210724_71.png”)]

注意
生成的私钥需妥善保管,避免遗失,不要泄露。应用私钥需填写到代码中供签名时使用应用公钥需提供给支付宝账号管理者上传到支付宝开放平台

可以看到生成的文件

[外链图片转存失败(img-aVRHCqhJ-1565442608661)(https://blog.starmeow.cn/media/blog/images/2019/08/BLOG_20190810_210715_31.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 “博客图集BLOG_20190810_210715_31.png”)]

然后在沙箱页面中 RSA2(SHA256)密钥(推荐) 点击 设置应用公钥,复制应用公钥,粘贴到输入框,官方文档: https://docs.open.alipay.com/291/105972/

[外链图片转存失败(img-2J0i46Vt-1565442608661)(https://blog.starmeow.cn/media/blog/images/2019/08/BLOG_20190810_210708_72.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 “博客图集BLOG_20190810_210708_72.png”)]

保存3个密钥到项目

应用私钥和公钥

公钥和私钥都需要妥善保存,保存到我们项目目录 apps/trade/keys 下,千万别泄露了,不要通过Git上传。

保存到项目的密钥需要加上下面的字符串,不能有错

-----BEGIN PRIVATE KEY-----
KEY。。。
-----END PRIVATE KEY-----

[外链图片转存失败(img-tyCGavhr-1565442608662)(https://blog.starmeow.cn/media/blog/images/2019/08/BLOG_20190810_210701_78.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 “博客图集BLOG_20190810_210701_78.png”)]

这儿执行文件名的修改,将中文改为英文,第一个为应用私钥,第二个为应用公钥(对用户来说用处不大)

BLOG_20190810_210655_68

支付宝公钥

在页面上也会出现 查看支付宝公钥,点击会出现下面的弹框,这个支付宝公钥在代码中验签使用

[外链图片转存失败(img-RzYubfEd-1565442608662)(https://blog.starmeow.cn/media/blog/images/2019/08/BLOG_20190810_210648_17.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 “博客图集BLOG_20190810_210648_17.png”)]

复制内容保存到我们项目中,格式和之前的一样,在同一目录下新建一个文件,名为 alipay_key_2048.txt

BLOG_20190810_210642_25

-----BEGIN PRIVATE KEY-----
支付宝公钥
-----END PRIVATE KEY-----

应用私钥和支付宝公钥特别重要,应用公钥对我们用处不大。请求支付宝接口时,用我们的应用私钥来进行加密,支付宝用我们上传的应用公钥对签名做验证;支付宝公钥用来查询订单状态。

分析接口文档

支付宝 统一收单下单并支付页面接口 文档在 https://docs.open.alipay.com/api_1/alipay.trade.page.pay/ ,可以通过访问 开放平台 https://openhome.alipay.com/developmentDocument.htm ,点击 电脑网站支付 ,点击 API列表,点击 alipay.trade.page.pay 进入 统一收单下单并支付页面接口

公共参数
请求地址
环境HTTPS请求地址
正式环境https://openapi.alipay.com/gateway.do

使用沙箱环境,就是用沙箱环境的网关

公共请求参数

请求时需要带一些参数,主要看必填字段

参数类型是否必填最大长度描述示例值
app_idString32支付宝分配给开发者的应用ID2014072300007148
methodString128接口名称alipay.trade.page.pay
formatString40仅支持JSONJSON
return_urlString256HTTP/HTTPS开头字符串https://m.alipay.com/Gk8NF23
charsetString10请求使用的编码格式,如utf-8,gbk,gb2312等utf-8
sign_typeString10商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2RSA2
signString344商户请求参数的签名串,详见签名详见示例
timestampString19发送请求的时间,格式"yyyy-MM-dd HH:mm:ss"2014-07-24 03:07:50
versionString3调用的接口版本,固定为:1.01.0
notify_urlString256支付宝服务器主动通知商户服务器里指定的页面http/https路径。http://api.test.alipay.net/atinterface/receive_notify.htm
app_auth_tokenString40详见应用授权概述
biz_contentString请求参数的集合,最大长度不限,除公共参数外所有请求参数都必须放在这个参数中传递,具体参照各产品快速接入文档

signbiz_content最重要,且容易出错。

请求参数(查看必填字段)
参数类型是否必填最大长度描述示例值
out_trade_noString必选64商户订单号,64个字符以内、可包含字母、数字、下划线;需保证在商户端不重复20150320010101001
product_codeString必选64销售产品码,与支付宝签约的产品码名称。 注:目前仅支持FAST_INSTANT_TRADE_PAYFAST_INSTANT_TRADE_PAY
total_amountPrice必选11订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]。88.88
subjectString必选256订单标题Iphone6 16G
公共响应参数
参数类型是否必填最大长度描述示例值
codeString-网关返回码,详见文档40004
msgString-网关返回码描述,详见文档Business Failed
sub_codeString-业务返回码,参见具体的API接口文档ACQ.TRADE_HAS_SUCCESS
sub_msgString-业务返回码描述,参见具体的API接口文档交易已被支付
signString-签名,详见文档DZXh8eeTuAHoYE3w1J+POiPhfDxOYBfUNn1lkeT/V7P4zJdyojWEa6IZs6Hz0yDW5Cp/viufUb5I0/V5WENS3OYR8zRedqo6D+fUTdLHdc+EFyCkiQhBxIzgngPdPdfp1PIS7BdhhzrsZHbRqb7o4k3Dxc+AAnFauu4V6Zdwczo=
响应参数
参数类型是否必填最大长度描述示例值
trade_noString必填64支付宝交易号2013112011001004330000121536
out_trade_noString必填64商户订单号6823789339978248
seller_idString必填16收款支付宝账号对应的支付宝唯一用户号。 以2088开头的纯16位数字2088111111116894
total_amountPrice必填11交易金额128.00
merchant_order_noString必填32商户原始订单号,最大长度限制32位20161008001

使用应用私钥生成请求签名

官方文档: https://docs.open.alipay.com/291/106118

如果未使用支付宝开放平台SDK,需要自行实现签名过程。

1.筛选并排序

获取所有请求参数,不包括字节类型参数,如文件、字节流,剔除sign字段,剔除值为空的参数,并按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。

2.拼接

将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,此时生成的字符串为待签名字符串。

例如下面的请求示例,参数值都是示例,开发者参考格式即可:

REQUEST URL: https://openapi.alipay.com/gateway.do
REQUEST METHOD: POST
CONTENT:
app_id=2014072300007148
method=alipay.mobile.public.menu.add
charset=GBK
sign_type=RSA2
timestamp=2014-07-24 03:07:50
biz_content={"button":[{"actionParam":"ZFB_HFCZ","actionType":"out","name":"话费充值"},{"name":"查询","subButton":[{"actionParam":"ZFB_YECX","actionType":"out","name":"余额查询"},{"actionParam":"ZFB_LLCX","actionType":"out","name":"流量查询"},{"actionParam":"ZFB_HFCX","actionType":"out","name":"话费查询"}]},{"actionParam":"http://m.alipay.com","actionType":"link","name":"最新优惠"}]}
sign=e9zEAe4TTQ4LPLQvETPoLGXTiURcxiAKfMVQ6Hrrsx2hmyIEGvSfAQzbLxHrhyZ48wOJXTsD4FPnt+YGdK57+fP1BCbf9rIVycfjhYCqlFhbTu9pFnZgT55W+xbAFb9y7vL0MyAxwXUXvZtQVqEwW7pURtKilbcBTEW7TAxzgro=
version=1.0

则待签名字符串为:

app_id=2014072300007148&biz_content={"button":[{"actionParam":"ZFB_HFCZ","actionType":"out","name":"话费充值"},{"name":"查询","subButton":[{"actionParam":"ZFB_YECX","actionType":"out","name":"余额查询"},{"actionParam":"ZFB_LLCX","actionType":"out","name":"流量查询"},{"actionParam":"ZFB_HFCX","actionType":"out","name":"话费查询"}]},{"actionParam":"http://m.alipay.com","actionType":"link","name":"最新优惠"}]}&charset=GBK&method=alipay.mobile.public.menu.add&sign_type=RSA2&timestamp=2014-07-24 03:07:50&version=1.0

3.调用签名函数

使用各自语言对应的SHA256WithRSA(对应sign_type为RSA2)或SHA1WithRSA(对应sign_type为RSA)签名函数利用商户私钥对待签名字符串进行签名,并进行Base64编码。

使用支付宝公钥验签

如果未使用支付宝开放平台SDK,需要自行实现验签过程。
同步返回和异步通知报文格式及验签方法有所区别。

同步返回验签

开发者只对支付宝返回的json中xxx_response的值做验签(xxx代表接口名)。

xxx_response的json值内容需要包含首尾的“{”和“}”两个尖括号,双引号也需要参与验签,如果字符串中包含“http://”的正斜杠,需要先将正斜杠做转义,默认打印出来的字符串是已经做过转义的。建议验签不通过时将正斜杠转义一次后再做一次验签。

如当面付扫码支付获取二维码的返回内容为:

{"alipay_trade_precreate_response":{"code":"10000","msg":"Success","out_trade_no":"6141161365682511","qr_code":"https:\/\/qr.alipay.com\/bax03206ug0kulveltqc80a8"},"sign":"VrgnnGgRMNApB1QlNJimiOt5ocGn4a4pbXjdoqjHtnYMWPYGX9AS0ELt8YikVAl6LPfsD7hjSyGWGjwaAYJjzH1MH7B2/T3He0kLezuWHsikao2ktCjTrX0tmUfoMUBCxKGGuDHtmasQi4yAoDk+ux7og1J5tL49yWiiwgaJoBE="}

则待验签字段为:

{"code":"10000","msg":"Success","out_trade_no":"6141161365682511","qr_code":"https:\/\/qr.alipay.com\/bax03206ug0kulveltqc80a8"}

同时取出签名值sign:

VrgnnGgRMNApB1QlNJimiOt5ocGn4a4pbXjdoqjHtnYMWPYGX9AS0ELt8YikVAl6LPfsD7hjSyGWGjwaAYJjzH1MH7B2/T3He0kLezuWHsikao2ktCjTrX0tmUfoMUBCxKGGuDHtmasQi4yAoDk+ux7og1J5tL49yWiiwgaJoBE=

调用验签函数:使用各自语言对应的SHA256WithRSA(对应sign_type为RSA2)或SHA1WithRSA(对应sign_type为RSA)签名验证函数,传入待验签字段、支付宝公钥、签名内容(sign),验签方法(signType)进行验签,根据返回结果判定是否验签通过。

异步通知验签

某些情况下(比如扫码支付成功时),支付宝会给商户发送异步通知。

如果某商户设置的通知地址为https://api.xx.com/receive_notify.htm,对应接收到通知的示例如下:

https://api.xx.com/receive_notify.htm?total_amount=2.00&buyer_id=2088102116773037&body=大乐透2.1&trade_no=2016071921001003030200089909&refund_fee=0.00&notify_time=2016-07-19 14:10:49&subject=大乐透2.1&sign_type=RSA2&charset=utf-8&notify_type=trade_status_sync&out_trade_no=0719141034-6418&gmt_close=2016-07-19 14:10:46&gmt_payment=2016-07-19 14:10:47&trade_status=TRADE_SUCCESS&version=1.0&sign=kPbQIjX+xQc8F0/A6/AocELIjhhZnGbcBN6G4MM/HmfWL4ZiHM6fWl5NQhzXJusaklZ1LFuMo+lHQUELAYeugH8LYFvxnNajOvZhuxNFbN2LhF0l/KL8ANtj8oyPM4NN7Qft2kWJTDJUpQOzCzNnV9hDxh5AaT9FPqRS6ZKxnzM=&gmt_create=2016-07-19 14:10:44&app_id=2015102700040153&seller_id=2088102119685838&notify_id=4a91b7a78a503640467525113fb7d8bg8e

验签流程:

1.在通知返回参数列表中,除去sign、sign_type两个参数外,凡是通知返回回来的参数皆是待验签的参数。

**TIPS:**生活号异步通知组成的待验签串里需要保留sign_type参数。

2.将剩下参数进行url_decode, 然后进行字典排序,组成字符串,得到待签名字符串:

body=大乐透2.1&buyer_id=2088102116773037&charset=utf-8&gmt_close=2016-07-19 14:10:46&gmt_payment=2016-07-19 14:10:47&notify_time=2016-07-19 14:10:49&notify_type=trade_status_sync&out_trade_no=0719141034-6418&refund_fee=0.00&subject=大乐透2.1&total_amount=2.00&trade_no=2016071921001003030200089909&trade_status=TRADE_SUCCESS&version=1.0

3.将签名参数(sign)使用base64解码为字节码串。

4.使用RSA的验签方法,通过签名字符串、签名参数(经过base64解码)及支付宝公钥验证签名,根据返回结果判定是否验签通过。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值