支付宝沙箱:
https://blog.csdn.net/weixin_44520739/article/details/89214609
支付宝支付:
https://github.com/fzlee/alipay/blob/master/README.zh-hans.md
使用步骤:
1.下载
pip install python-alipay-sdk --upgrade
2.修改公钥和私钥
创建alipay_key文件夹,将生成的公钥私钥文件复制粘贴在此文件夹下并改成英文名
在支付宝上下载的公钥是一个字符串,你需要在文本的首尾添加标记位
#公钥注意不是生成的公钥,而是配置好后的支付宝公钥
(-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----)
(-----BEGIN RSA2 PRIVATE KEY----- 和-----END RSA2 PRIVATE KEY-----)
3.settings中配置公钥私钥
PRIVATE_KEY_PATH = os.path.join(BASE_DIR, 'alipay_key/private_key_2048.txt')
PUBLIC_KEY_PATH = os.path.join(BASE_DIR, 'alipay_key/public_key_2048.txt')
4.创建支付宝对象
app_private_key_string = open(PRIVATE_KEY_PATH).read()
alipay_public_key_string = open(PUBLIC_KEY_PATH).read()
alipay = AliPay(
appid="你的appid", # 获取沙箱的appid
app_notify_url=None, # 默认回调url
app_private_key_string=app_private_key_string,
# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
alipay_public_key_string=alipay_public_key_string,
sign_type="RSA2", # RSA 或者 RSA2
debug=True # 默认False
)
5.产生订单字符串
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no=obj.order_sn,
total_amount=obj.order_mount,
subject=obj.order_sn,
return_url="http://127.0.0.1:8000/alipay/return",
notify_url="https://example.com/notify" # 可选, 不填则使用默认notify url
)
6.拼接网关:
url = 'https://openapi.alipaydev.com/gateway.do?'+order_string
7.支付完成后的操作
class AlipayView(APIView):
def get(self, request):
alipay_message = {}
print('GET:',request.GET)
for key, value in request.GET.items():
alipay_message[key] = value
sign = alipay_message.pop('sign', None)
print('alipay_message:', alipay_message)
app_private_key_string = open(PRIVATE_KEY_PATH).read()
alipay_public_key_string = open(PUBLIC_KEY_PATH).read()
alipay = AliPay(
appid="2016092300575166", # 获取沙箱的appid
app_notify_url=None, # 默认回调url
app_private_key_string=app_private_key_string,
# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
alipay_public_key_string=alipay_public_key_string,
sign_type="RSA2", # RSA 或者 RSA2
debug=True # 默认False
)
# 使用支付对象进行验签
flag = alipay.verify(alipay_message, sign)
if flag:
data = alipay_message.get('alipay_trade_page_pay_response')
trade_no = data.get("trade_no", None) # 支付宝的交易号
out_trade_no = data.get('out_trade_no', None)
pay_status = data.get('trade_status', None)
pay_time = data.get('gmt_payment', None)
orderinfo = OrderInfo.objects.filter(order_sn=out_trade_no)
# 更新订单状态
orderinfo.pay_status = pay_status
orderinfo.pay_time = pay_time
orderinfo.trade_no = trade_no
orderinfo.save()
return JsonResponse({'status': 'ok'})