支付宝支付 (沙箱环境)

支付宝支付

  • 正式环境:营业执照等信息。

    https://opendocs.alipay.com/open/270/105899
  • 沙箱环境,模拟真实的环境。

    https://opendocs.alipay.com/open/200/105311

1.申请开通沙箱环境

https://openhome.alipay.com/platform/appDaily.htm?tab=info

注册成功之后会获取两个值:

2.生成秘钥

秘钥用于以后对URL中添加的参数进行加密和校验。

2.1 下载秘钥生成器

生成一对秘钥:

  • 应用公钥
  • 应用私钥

2.2 上传应用公钥并获得支付宝公钥

本次操作中共获取到三个秘钥:

  • 应用公钥
  • 应用私钥,对以后URL中传入的数据进行签名加密用。
  • 支付宝公钥(通过应用公钥生成),在页面支付成功后跳转回来时候,对支付宝给我们传的值进行校验。

3.账户信息和测试APP

  • 买家信息

    买家账号uppiav5017@sandbox.com
    登录密码111111
    支付密码111111
    用户名称沙箱环境
    证件类型身份证(IDENTITY_CARD)
    证件号码939581196106136440
    账户余额
    99999.00充值取现
  • 商家信息

    商家账号ijcwgw5346@sandbox.com
    商户UID2088102180940005
    登录密码111111
    账户余额
    0.00充值取现
  • APP

4.两种支持

  • SDK,写好一个Python模块
    https://opendocs.alipay.com/open/54/103419

    1. 安装模块
    2. 基于模块实现想要的功能
    pip install alipay-sdk-python==3.3.398
    # 不推荐
  • API,就是给你提供的一个URL
    https://opendocs.alipay.com/apis/api_1/alipay.trade.page.pay

    1. 自己手动会URL进行处理和加密
    让你跳转到这个地址:【网关?参与】 组成
    网关 = https://openapi.alipaydev.com/gateway.do
    参数 = {
    app_id:"2016102400754054",
    method:"alipay.trade.page.pay"
    format:"JSON",
    return_url:"支付成功之后跳转GET到的那个页面地址",
    notify_url:"同时偷偷想这个地址发送一个POST请求",
    charset:"utf-8",
    sign_type:"RSA2",
    sign:"签名",
    timestamp:"2014-07-24 03:07:50",
    version:'1.0',
    biz_content:{
    out_trade_no:"订单号",
    product_code:"FAST_INSTANT_TRADE_PAY",
    total_amount:11.68,
    subject:"订单标题"
    }
    }
    如果支付成功之后,服务器宕机,如何处理?
    偷偷向notify_url发请求,说支付成功了,你更改下状态。
    服务器宕机,支付宝访问不到,则会在24小时以内发送:支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h
    我的网站接收到支付宝请求之后,返回数据不正确,同上。
    返回一个字符串 "success"
    https://opendocs.alipay.com/open/270/105902/
    支付宝签名的过程:对参数进行处理,处理完之后再让他和网关拼接起来。
    网关 = https://openapi.alipaydev.com/gateway.do
    params = {
    app_id:"2016102400754054",
    method:"alipay.trade.page.pay"
    format:"JSON",
    return_url:"支付成功之后跳转GET到的那个页面地址",
    notify_url:"同时偷偷想这个地址发送一个POST请求",
    charset:"utf-8",
    sign_type:"RSA2",
    sign:"签名",
    timestamp:"2014-07-24 03:07:50",
    version:'1.0',
    biz_content:{
    out_trade_no:"订单号",
    product_code:"FAST_INSTANT_TRADE_PAY",
    total_amount:11.68,
    subject:"订单标题"
    }
    }
    1. 将参数中 空、文件、字节、sign 踢出。
    params.pop(sign)
    2. 排序,对参数中所有的key进行从小大大排序 sort(params)
    并按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。
    3. 将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,此时生成的字符串为待签名字符串。
    待签名的字符串 = "app_id=2016102400754054&method=alipay.trade.page.pay"
    注意:1.有字典应该转换为字符串; 2.字符串中间不能有空格。
    json.dumps(info,separators=(",",":"))
    4.使用各自语言对应的SHA256WithRSA签名函数并利用商户(应用)私钥对待签名字符串进行签名,并进行Base64编码。
    result = 使用 SHA256WithRSA 函数和私钥对签名字符串进行签名
    签名 = 在对result进行Base64编码
    把签名再添加到会params字典中 params[sign] = 签名
    注意:base64编码之后之后,内部不能有换行符 签名.replace("\n","")
    5.再讲所有的参数拼接起来。
    注意:在拼接URL时候不能出现 ;,(等字符, 提前将特殊字符转换URL转义的字符。
    from urllib.parse import quote_plus
    https://opendocs.alipay.com/open/291/105974
    https://opendocs.alipay.com/open/291/106118
    # pip3 install pycrypto
    # 如果是 pycryptodom.xxxx.whl 下载到本地,pip install pycryptodom.xxxx.whl
    # 构造字典
    params = {
    'app_id': "2016102400754054",
    'method': 'alipay.trade.page.pay',
    'format': 'JSON',
    'return_url': "http://127.0.0.1:8001/pay/notify/",
    'notify_url': "http://127.0.0.1:8001/pay/notify/",
    'charset': 'utf-8',
    'sign_type': 'RSA2',
    'timestamp': datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
    'version': '1.0',
    'biz_content': json.dumps({
    'out_trade_no': order_id,
    'product_code': 'FAST_INSTANT_TRADE_PAY',
    'total_amount': 1.11,
    'subject': "x1"
    }, separators=(',', ':'))
    }
    # 获取待签名的字符串
    unsigned_string = "&".join(["{0}={1}".format(k, params[k]) for k in sorted(params)])
    print(unsigned_string)
    # 签名 SHA256WithRSA(对应sign_type为RSA2)
    from Crypto.PublicKey import RSA
    from Crypto.Signature import PKCS1_v1_5
    from Crypto.Hash import SHA256
    from base64 import decodebytes, encodebytes
    # SHA256WithRSA + 应用私钥 对待签名的字符串 进行签名
    private_key = RSA.importKey(open("files/skd/应用私钥2048.txt").read())
    signer = PKCS1_v1_5.new(private_key)
    signature = signer.sign(SHA256.new(unsigned_string.encode('utf-8')))
    # 对签名之后的执行进行base64 编码,转换为字符串
    sign_string = encodebytes(signature).decode("utf8").replace('\n', '')
    # 把生成的签名赋值给sign参数,拼接到请求参数中。
    from urllib.parse import quote_plus
    result = "&".join(["{0}={1}".format(k, quote_plus(params[k])) for k in sorted(params)])
    result = result + "&sign=" + quote_plus(sign_string)
    gateway = "https://openapi.alipaydev.com/gateway.do"
    pay_url = "{}?{}".format(gateway, result)

5.常见报错:秘钥

秘钥格式问题。

6.常见报错:钓鱼网站

(测试时退出支付宝就好了)

posted @   hanfe1  阅读(780)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2019-12-22 第十一章 前端开发-bootstrap
点击右上角即可分享
微信分享提示