django 项目接入支付宝支付
1. 准备环境
注册支付包沙箱环境, https://open.alipay.com/develop/sandbox/app, 其中 APPID、接口加签方式、支付宝网关地址 需要关注(沙箱环境)
python -m pip install python-alipay-sdk==3.3.0
##2. 在django的配置文件中添加之支付宝的配置。
######################支付宝支付相关################################
ALIPAY_APPID = 9021000134691081 #沙箱中的APPID
ALIPAY_DEBUG = True # 沙箱中的调试模式, 会在控制台打印日志
ALIPAY_URL = 'https://openapi-sandbox.dl.alipaydev.com/gateway.do' # 沙箱中的支付宝网关地址, 接入生产环境时 需要更改网关地址
ALIPAY_RETURN_URL = 'http://www.nihao.site:8080/pay_success.html' # 支付宝支付成功时, 页面跳转的地址
APP_PRIVATE_KEY_PATH = os.path.join(BASE_DIR, 'apps/pay/keys/app_private_key.pem') #当前应用的私钥, 当前应用的公钥需要上传到沙箱, ————》 接口加签方式--》自定义密钥
ALIPAY_PUBLIC_KEY_PATH = os.path.join(BASE_DIR, 'apps/pay/keys/alipay_public_key.pem') # 支付宝的公钥, 支付宝的私钥在支付宝那里,只需要将支付宝公钥迁移到当前应用上即可。以.pem文件结尾。
app 生成密钥方法(linux系统):
openssl
OpenSSL> genrsa -out app_private_key.pem # 生成私钥
OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 通过私钥导出公钥
3. 接入支付宝的业务逻辑
1. 获取订单id
2. 验证订单id (根据订单id查询订单信息)
3. 读取应用私钥和支付宝公钥
4. 创建支付宝实例
5. 调用支付宝的支付方法
6. 拼接连接
7. 返回响应
注:用于跳转支付宝页面的信息,POST和GET方法生成内容不同:使用POST方法执行,结果为html form表单,在浏览器渲染即可;
使用GET方法会得到支付宝URL,需要打开或重定向到该URL。建议使用POST方式。
def get(self, request, order_id):
user = request.user
try:
order = OrderInfo.objects.get(order_id=order_id,
status=OrderInfo.ORDER_STATUS_ENUM[‘UNPAID’],
user=user)
except OrderInfo.DoesNotExist:
return JsonResponse({‘code’:400,‘errmsg’:‘没有此订单’})
# 读取配置的支付宝公钥和档期那应用的私钥
app_private_key_string = open(dev.APP_PRIVATE_KEY_PATH).read()
alipay_public_key_string = open(dev.ALIPAY_PUBLIC_KEY_PATH).read()
alipay = AliPay(
appid=dev.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=dev.ALIPAY_DEBUG, # 默认 False
verbose=True, # 输出调试数据
config=AliPayConfig(timeout=15) # 可选,请求超时时间
)
subject = "测试订单"
# 电脑网站支付,需要跳转到:https://openapi.alipay.com/gateway.do? + order_string # 生产环境中使用
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no=order_id, # 订单id
total_amount=str(order.total_amount), # 总价钱
subject=subject, # 主题
return_url=dev.ALIPAY_RETURN_URL, # 支付成功后跳转的页面
notify_url="https://example.com/notify" # 可选,不填则使用默认 notify url
)
pay_url = 'https://openapi-sandbox.dl.alipaydev.com/gateway.do?'+order_string # 沙箱环境使用, 出现页面跳转不到沙箱页面上时, 可检查当前的网关是不是沙箱环境的网关
return JsonResponse({
'code': 0,
'errmsg':'ok',
'alipay_url': pay_url
})
##4. 调试