您现在的位置是: 网站首页 >Django >Vue+Django REST framework前后端分离生鲜电商 Django

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

admin2019年8月10日 21:05 Django | Python | Vue 193人已围观

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 ,右上角进入 管理中心 ![BLOG_20190810_210747_47](/media/blog/images/2019/08/BLOG_20190810_210747_47.png "博客图集BLOG_20190810_210747_47.png") 企业账户才能创建应用,个人账户不行,但可以在沙箱中进行调试,这个应用是自动生成的 ![BLOG_20190810_210740_37](/media/blog/images/2019/08/BLOG_20190810_210740_37.png "博客图集BLOG_20190810_210740_37.png") ### 密钥生成步骤 查看密钥生成方法 ![BLOG_20190810_210731_91](/media/blog/images/2019/08/BLOG_20190810_210731_91.png "博客图集BLOG_20190810_210731_91.png") 可以访问 https://docs.open.alipay.com/291/105971 按步骤即可 下载 RSA签名验签工具windows,运行里面的 .bat 文件 ![BLOG_20190810_210724_71](/media/blog/images/2019/08/BLOG_20190810_210724_71.png "博客图集BLOG_20190810_210724_71.png") **注意**: 生成的私钥需妥善保管,避免遗失,不要泄露。**应用私钥需填写到代码中供签名时使用**。**应用公钥需提供给支付宝账号管理者上传到支付宝开放平台**。 可以看到生成的文件 ![BLOG_20190810_210715_31](/media/blog/images/2019/08/BLOG_20190810_210715_31.png "博客图集BLOG_20190810_210715_31.png") 然后在沙箱页面中 RSA2(SHA256)密钥(推荐) 点击 设置应用公钥,复制应用公钥,粘贴到输入框,官方文档: https://docs.open.alipay.com/291/105972/ ![BLOG_20190810_210708_72](/media/blog/images/2019/08/BLOG_20190810_210708_72.png "博客图集BLOG_20190810_210708_72.png") ### 保存3个密钥到项目 #### 应用私钥和公钥 公钥和私钥都需要妥善保存,保存到我们项目目录 apps/trade/keys 下,千万别泄露了,不要通过Git上传。 保存到项目的密钥需要加上下面的字符串,不能有错 ```key -----BEGIN PRIVATE KEY----- KEY。。。 -----END PRIVATE KEY----- ``` ![BLOG_20190810_210701_78](/media/blog/images/2019/08/BLOG_20190810_210701_78.png "博客图集BLOG_20190810_210701_78.png") 这儿执行文件名的修改,将中文改为英文,第一个为应用私钥,第二个为应用公钥(对用户来说用处不大) ![BLOG_20190810_210655_68](/media/blog/images/2019/08/BLOG_20190810_210655_68.png "博客图集BLOG_20190810_210655_68.png") #### 支付宝公钥 在页面上也会出现 查看支付宝公钥,点击会出现下面的弹框,这个**支付宝公钥在代码中验签使用**。 ![BLOG_20190810_210648_17](/media/blog/images/2019/08/BLOG_20190810_210648_17.png "博客图集BLOG_20190810_210648_17.png") 复制内容保存到我们项目中,格式和之前的一样,在同一目录下新建一个文件,名为 alipay_key_2048.txt ![BLOG_20190810_210642_25](/media/blog/images/2019/08/BLOG_20190810_210642_25.png "博客图集BLOG_20190810_210642_25.png") ``` -----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_id | String | 是 | 32 | 支付宝分配给开发者的应用ID | 2014072300007148 | | method | String | 是 | 128 | 接口名称 | alipay.trade.page.pay | | format | String | 否 | 40 | 仅支持JSON | JSON | | return_url | String | 否 | 256 | HTTP/HTTPS开头字符串 | https://m.alipay.com/Gk8NF23 | | charset | String | 是 | 10 | 请求使用的编码格式,如utf-8,gbk,gb2312等 | utf-8 | | sign_type | String | 是 | 10 | 商户生成签名字符串所使用的签名算法类型,目前支持RSA2和RSA,推荐使用RSA2 | RSA2 | | sign | String | 是 | 344 | 商户请求参数的签名串,详见[签名](https://docs.open.alipay.com/291/105974) | 详见示例 | | timestamp | String | 是 | 19 | 发送请求的时间,格式"yyyy-MM-dd HH:mm:ss" | 2014-07-24 03:07:50 | | version | String | 是 | 3 | 调用的接口版本,固定为:1.0 | 1.0 | | notify_url | String | 否 | 256 | 支付宝服务器主动通知商户服务器里指定的页面http/https路径。 | http://api.test.alipay.net/atinterface/receive_notify.htm | | app\_auth\_token | String | 否 | 40 | 详见[应用授权概述](https://docs.open.alipay.com/common/105193) | | | biz_content | String | 是 | | 请求参数的集合,最大长度不限,除公共参数外所有请求参数都必须放在这个参数中传递,具体参照各产品快速接入文档 | | `sign`和`biz_content`最重要,且容易出错。 #### 请求参数(查看必填字段) | 参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 | | -------------- | ------ | ------- | ------- | ------------------------------------------------------------------------- | ------------------------ | | out\_trade\_no | String | 必选 | 64 | 商户订单号,64个字符以内、可包含字母、数字、下划线;需保证在商户端不重复 | 20150320010101001 | | product_code | String | 必选 | 64 | 销售产品码,与支付宝签约的产品码名称。 注:目前仅支持FAST\_INSTANT\_TRADE_PAY | FAST\_INSTANT\_TRADE_PAY | | total_amount | Price | 必选 | 11 | 订单总金额,单位为元,精确到小数点后两位,取值范围\[0.01,100000000\]。 | 88.88 | | subject | String | 必选 | 256 | 订单标题 | Iphone6 16G | #### 公共响应参数 | 参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 | | --- | --- | --- | --- | --- | --- | | code | String | 是 | - | 网关返回码,[详见文档](https://docs.open.alipay.com/common/105806) | 40004 | | msg | String | 是 | - | 网关返回码描述,[详见文档](https://docs.open.alipay.com/common/105806) | Business Failed | | sub_code | String | 否 | - | 业务返回码,参见具体的API接口文档 | ACQ.TRADE\_HAS\_SUCCESS | | sub_msg | String | 否 | - | 业务返回码描述,参见具体的API接口文档 | 交易已被支付 | | sign | String | 是 | - | 签名,[详见文档](https://docs.open.alipay.com/291/106074) | DZXh8eeTuAHoYE3w1J+POiPhfDxOYBfUNn1lkeT/V7P4zJdyojWEa6IZs6Hz0yDW5Cp/viufUb5I0/V5WENS3OYR8zRedqo6D+fUTdLHdc+EFyCkiQhBxIzgngPdPdfp1PIS7BdhhzrsZHbRqb7o4k3Dxc+AAnFauu4V6Zdwczo= | #### 响应参数 | 参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 | | ------------------- | ------ | ------- | ------- | --------------------------------------------------------- | ---------------------------- | | trade_no | String | 必填 | 64 | 支付宝交易号 | 2013112011001004330000121536 | | out\_trade\_no | String | 必填 | 64 | 商户订单号 | 6823789339978248 | | seller_id | String | 必填 | 16 | 收款支付宝账号对应的支付宝唯一用户号。 以2088开头的纯16位数字 | 2088111111116894 | | total_amount | Price | 必填 | 11 | 交易金额 | 128.00 | | merchant\_order\_no | String | 必填 | 32 | 商户原始订单号,最大长度限制32位 | 20161008001 | ### 使用应用私钥生成请求签名 官方文档: https://docs.open.alipay.com/291/106118 > 如果未使用支付宝开放平台SDK,需要自行实现签名过程。 1.筛选并排序 获取所有请求参数,不包括字节类型参数,如文件、字节流,剔除sign字段,剔除值为空的参数,并按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。 2.拼接 将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,此时生成的字符串为待签名字符串。 例如下面的请求示例,参数值都是示例,开发者参考格式即可: ```html 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://”的正斜杠,需要先将正斜杠做转义,默认打印出来的字符串是已经做过转义的。建议验签不通过时将正斜杠转义一次后再做一次验签。 如当面付扫码支付获取二维码的返回内容为: ```json {"alipay_trade_precreate_response":{"code":"10000","msg":"Success","out_trade_no":"6141161365682511","qr_code":"https:\/\/qr.alipay.com\/bax03206ug0kulveltqc80a8"},"sign":"VrgnnGgRMNApB1QlNJimiOt5ocGn4a4pbXjdoqjHtnYMWPYGX9AS0ELt8YikVAl6LPfsD7hjSyGWGjwaAYJjzH1MH7B2/T3He0kLezuWHsikao2ktCjTrX0tmUfoMUBCxKGGuDHtmasQi4yAoDk+ux7og1J5tL49yWiiwgaJoBE="} ``` 则待验签字段为: ```json {"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)

文章交流

  • emoji
0人参与,0条评论

当前用户

未登录,点击   登录

站点信息

  • 建站时间:网站已运行590天
  • 系统信息:Linux
  • 后台程序:Python: 3.6.6
  • 网站框架:Django: 2.2.9
  • 文章统计:222 篇
  • 文章评论:40 条
  • 腾讯分析网站概况-腾讯分析
  • 百度统计网站概况-百度统计
  • 微信公众号:扫描二维码,关注我们
返回
顶部
标题 换行 登录
网站