【愚公系列】2022年02月 Django商城项目 34-订单支付功能实现(支付宝)
【摘要】 前言具体支付宝支付流程可参考这篇文章:https://www.cnblogs.com/xiaolu915/p/10528155.html 一、回调逻辑处理 1.安装SDKpip install python-alipay-sdk --upgrade 2.生成私钥公钥opensslOpenSSL> genrsa -out app_private_key.pem 2048 # 私钥RSA2O...
前言
具体支付宝支付流程可参考这篇文章:https://www.cnblogs.com/xiaolu915/p/10528155.html
一、回调逻辑处理
1.安装SDK
pip install python-alipay-sdk --upgrade
2.生成私钥公钥
openssl
OpenSSL> genrsa -out app_private_key.pem 2048 # 私钥RSA2
OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 导出公钥
OpenSSL> exit
在支付宝中下载的私钥文件格式需要修改成正确格式
3.setting中支付宝配置信息
ALIPAY_APPID = '2016091600523030'
ALIPAY_DEBUG = True
ALIPAY_URL = 'https://openapi.alipaydev.com/gateway.do'
ALIPAY_RETURN_URL = 'http://localhost:8000/payment/status/'
APP_PRIVATE_KEY_PATH = os.path.join(BASE_DIR, 'app/pay/keys/app_private_key.pem')
ALIPAY_PUBLIC_KEY_PATH = os.path.join(BASE_DIR, 'app/pay/keys/alipay_public_key.pem')
4.生成支付URL
class PaymentView(LoginRequiredJSONMixin,View):
def get(self,request,order_id):
# 0.接收验证订单
try:
# 传一个订单id是没有问题的
# 为了让查询的更准确, 我们是应该查询 未支付的
order = OrderInfo.objects.get(order_id=order_id,
user=request.user,
status=OrderInfo.ORDER_STATUS_ENUM['UNPAID'])
except OrderInfo.DoesNotExist:
return http.JsonResponse({'code':RETCODE.PARAMERR,'errmsg':'暂无此订单'})
# 1.创建alipay实例对象
app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()
alipay = AliPay(
appid=settings.ALIPAY_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
)
# 2.生成order_string
# 如果你是 Python 3的用户,使用默认的字符串即可
subject = "测试订单"
# 电脑网站支付,需要跳转到https://openapi.alipay.com/gateway.do? + order_string
# 正式环境的 https://openapi.alipay.com/gateway.do? + order_string
# 沙箱环境的 https://openapi.alipaydev.com/gateway.do
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no=order_id,
total_amount=str(order.total_amount),
subject=subject,
return_url=settings.ALIPAY_RETURN_URL,
)
# 3.拼接调转的url
pay_url = settings.ALIPAY_URL + '?' + order_string
# 4.返回
return http.JsonResponse({'code':RETCODE.OK,'pay_url':pay_url})
一直点击下一步支付成功后回跳转到回调地址
5.接收支付成功信息
class PayStatusView(View):
def get(self,request):
"""
将订单id和支付宝id保存起来
1.创建支付宝实例
2.获取验证数据
3.根据状态保存数据
"""
#
# 1.创建支付宝实例
app_private_key_string = open(settings.APP_PRIVATE_KEY_PATH).read()
alipay_public_key_string = open(settings.ALIPAY_PUBLIC_KEY_PATH).read()
alipay = AliPay(
appid=settings.ALIPAY_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
)
# 2.获取验证数据
data = request.GET.dict()
# sign 不能参与签名验证
signature = data.pop("sign")
# verify
success = alipay.verify(data, signature)
if success:
# 3.根据状态保存数据
"""
trade_no String 必填 64 支付宝交易号 2013112011001004330000121536
out_trade_no String 必填 64 商户订单号 6823789339978248
"""
trade_no = data.get('trade_no')
out_trade_no=data.get('out_trade_no')
Payment.objects.create(
order_id=out_trade_no,
trade_id=trade_no
)
return render(request,'pay_success.html',context={'trade_no':trade_no})
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)