python - alipay sdk 使用 及 注意点

一. 在 点击跳转 这里拿到自己的 appid  和  支付宝公钥 ,

   如果想要得到 支付宝的公钥 就需要获取 应用的公钥,具体获取方式 :

    获取应用公钥和私钥

  a. 应用私钥和支付宝公钥 获取 和 配置 过程:  

  1. 下载后打开文件夹  点击  RSA签名验签工具.bat   然后生成密钥 , 然后退出就行了

  2. 找到 RSA密钥 的文件夹 , 将里面的 应用公钥 复制一下 , 然后在 沙箱应用 中点击 查看应用公钥,

   点击修改,将刚才的 应用公钥 粘贴上去,然后保存,此刻你会多一个支付宝公钥 ( 注: 当你修改应用公钥后,支付宝公钥会自动生成 )

  3. 准备两个文本文件名为( 文件名随意,注意规范 ) :

      alipay_public_2048.txt (存放支付宝公钥) 和 app_private_2048.txt (存放应用私钥)

     这里注意两点 :

     1. 应用私钥指的是 刚刚 RSA密钥 文件夹中 的应用私钥 ,而 公钥指的是 刚刚上传 应用公钥后给你自动生成的 应用公钥

     2. 将应用私钥和支付宝公钥保存在 文本中的时候 要添加 一个标识 ( 必须加 ):

       - 打开 alipay_public_2048.txt(存放支付宝公钥) 这个空文本 格式是这样的:

           -----BEGIN PUBLIC KEY-----

           中间放入你的支付宝公钥

        -----END PUBLIC KEY-----

         - 打开 app_private_2048.txt (存放应用私钥)这个空文本 格式是这样的:

        -----BEGIN RSA PRIVATE KEY-----

            中间放你的应用私钥

        -----END RSA PRIVATE KEY-----

 

  b. 下载工作

  1. 配置服务端 sdk -- 官方链接 :https://pypi.org/project/alipay-sdk-python/

pip install python-alipay-sdk --upgrade

   2. 导入加密模块

pip install Crypto 

 

二:示例代码

   - Url

urlpatterns=[
    url(r"^index/$",views.index),   # 商品页面 API
    url(r"^back_url/$",views.back_url),    # 支付成功后的重定向 API
    url(r"^update_order/$",views.back_url),    # 支付成功后的异步POST请求 API
]

 

  - Views

from django.shortcuts import render,HttpResponse,redirect
from django.views.decorators.csrf import csrf_exempt    # 取消 csrf组件
import time
from alipay import AliPay

def Alipay():
    alipay = AliPay(
        appid='2016092800613180',  # appid (详细在你的沙箱应用中的 APPID)
        app_notify_url='http://127.0.0.1:8045/update_order/',  # 异步回调url(回调地址需是服务器地址,否则接收不到回调结果)
        app_private_key_path='app_test/app_private_2048.txt',   # 应用私钥
        alipay_public_key_path='app_test/alipay_public_2048.txt', # 支付宝公钥
        sign_type="RSA2",  # RSA 或者 RSA2 -- 这里注意一点:2018年1月5日后创建的应用只支持RSA2的格式;
        debug=True,  # 默认False -- 设置为True则是测试模式,正式上线的话改为 False就行了
    )
    return alipay

def index(request):
   """
      # 这里发起POST的支付请求 
    """
    if request.method == 'GET':
        return render(request,'index.html')
    alipay = Alipay()
    out_trade_no = "x2" + str(time.time())
    order_string = alipay.api_alipay_trade_page_pay(
        out_trade_no=out_trade_no,  # 订单号 - 注 : 每次的订单号不能一致
        total_amount=0.01,  #  商品价格
        subject='shop_name',  # 商品名称
        return_url = 'http://127.0.0.1:8045/back_url/',     # 支付成功后 - 重定向自己的网站
        notify_url='http://127.0.0.1:8045/update_order/'    # 支付成功后 - 异步发送支付结果到回调地址(地址需是服务器地址,否则无法接收到回调结果)
    )

    pay_url = "https://openapi.alipaydev.com/gateway.do?{}".format(order_string)
                                    # 注 :这里结尾不能加 /
    return redirect(pay_url)

def back_url(request):
    """
     # 支付成功后的回调函数 -- 重定向自己的网站
   # 同时在重定向之前会校验此次支付信息是否正确
    :param request:
    :return:
    """
    params = request.GET.dict()
    sign = params.pop('sign', None)
    print(params)
    alipay = Alipay()
    status = alipay.verify(params, sign)    # 返回 True or False
    if status:
        return HttpResponse('支付成功')
    return HttpResponse('支付失败')



@csrf_exempt
def update_order(request):
    """
    支付成功后,支付宝向该地址发送的POST请求(用于修改订单状态)
    :param request:
    :return:
    """
    if request.method == 'POST':
        from urllib.parse import parse_qs

        body_str = request.body.decode('utf-8')
        post_data = parse_qs(body_str)

        post_dict = {}
        for k, v in post_data.items():
            post_dict[k] = v[0]

        alipay = Alipay()

        sign = post_dict.pop('sign', None)
        status = alipay.verify(post_dict, sign)
        if status:
            # 1. 获取订单号(获取的订单号是你上面的参数: out_trade_no)
            out_trade_no = post_dict.get('out_trade_no')
            print(out_trade_no)
            # 2. 根据订单号将数据库中的数据进行更新(修改订单状态)
            return HttpResponse('success')
       # 3. 最终需要返回 "success" 字符给支付宝,否则支付宝将一直请求该地址并发送回调结果(具体看官方文档) return HttpResponse('success')  

 

  - AliPay 中的加密配置(本身就是配置好的,但是如果验证出问题了,看看这里对不对): 
from datetime import datetime
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
from urllib.parse import quote_plus
from urllib.parse import urlparse, parse_qs
from base64 import decodebytes, encodebytes
import json
 
   

 三:最后总结一点容易出现的错误 和 一些方法的说明

    - return_url :支付成功后 - 重定向自己的网站

  - notify_url :支付成功后 - 发送的POST订单验证消息(异步)

  - out_trade_no :这个是订单号 -- 注意一点,千万不要测试的时候每次使用一个同一个订单号,否则会出现支付页面无法打开的问题

  - debug = True / False :如果等于 True 的话就是测试环境的支付,如果是 False 就是正式环境的支付

  - app_private_key_path :后面写 应用的私钥 路径位置

  - alipay_public_key_path : 后面写 支付宝的公钥 路径位置

  - sign_type = "RSA2" :可以使用  RSA 或者 RSA2 ,

        这里注意下 :2018年1月5日后创建的应用只支持RSA2的格式;          

  - "https://openapi.alipaydev.com/gateway.do?{}".format(order_string)  --  结尾不要加 / (反斜杠)

    带 dev 则是测试用的接口,但是不带 dev 就是真正的支付接口

 - 最后说一点规范:
    1. 建议把 AliPay 下面的 appid 什么的信息 写在 settings 中,
      然后导入 settings 在通过 settings.APPID 拿到信息
    2. 将存放 应用密钥 和 支付宝公钥 的 txt 文件放到单独一个文件夹中

 

转载于:https://www.cnblogs.com/chaoqi/p/10441064.html

你可能感兴趣的:(python - alipay sdk 使用 及 注意点)