• 支付宝支付 (沙箱环境)


    支付宝支付

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

      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("
      ","")
      	
      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('
      ', '')
      
      # 把生成的签名赋值给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.常见报错:钓鱼网站

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

  • 相关阅读:
    HFish 源码Git下载 源码编译执行
    Windows注册表-学习总结
    利用PHPStudy搭建Xdebug调试环境
    Python3报错Crypto失败(from Crypto.Cipher import AES ModuleNotFoundError: No module named 'Crypto')
    Django后台管理admin字段控制显示长度(字段内容过长,省略号替代)
    PHP代码审计-小题一道
    golang编程-小问题
    迅雷影音播放器-ass字幕乱码-问题
    《独自等待》观影有感
    Python urllib URL 处理模块
  • 原文地址:https://www.cnblogs.com/hanfe1/p/14174479.html
Copyright © 2020-2023  润新知