Django使用支付宝付款功能
支付宝官方没有Python语言的接口,这我们在Python官方找到alipay这个包,这样就不用我们自己造轮子了
事先需要设置自己的私钥 公钥
- openssl
- OpenSSL> genrsa -out app_private_key.pem 2048 # 私钥
- OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 导出公钥
- OpenSSL> exit
还需要在支付宝里面设置支付宝的公钥 和写上我们的公钥
# 支付宝设置
ALIPAY_APPID = '2016091500520680'
# 私钥
APP_PRIVATE_KEY_PATH = os.path.join(BASE_DIR, 'utils/app_private_key.pem')
# 公钥
ALIPAY_PUBLIC_KEY_PATH = os.path.join(BASE_DIR, 'utils/alipay_public_key.pem')
# 接口
ALIPAY_URL = 'https://openapi.alipaydev.com/gateway.do?'
这里我们只使用2个接口,一个是生成订单,一个是查询订单状态
# 导入alipay包
from alipay import AliPay
# 导入支付宝设置
from django.conf import settings
def create_alipay():
# 创建alipay对象
alipay = AliPay(
appid=settings.ALIPAY_APPID,
app_notify_url=None,
app_private_key_path=settings.APP_PRIVATE_KEY_PATH,
alipay_public_key_path=settings.ALIPAY_PUBLIC_KEY_PATH,
sign_type="RSA2", # 密码加密方式
debug=True # 如果使用沙箱则为True,正式环境使用flase
)
return alipay
def get_alipay_page(order_id, total_amount):
"""生成订单"""
alipay = create_alipay()
print(5)
# 调用接口
order_string = alipay.api_alipay_trade_page_pay(
out_trade_no=order_id,
total_amount=str(total_amount),
subject='支付付款',
return_url=None,
notify_url=None,
)
# 返回订单url
print(order_string)
return settings.ALIPAY_URL+order_string
def get_alipay_query(order_id):
"""查询订单状态"""
alipay = create_alipay()
result = alipay.api_alipay_trade_query(out_trade_no=order_id)
print(result)
if result.get("trade_status", "") == "TRADE_SUCCESS":
return True
else:
return False
然后我们只需要在生成订单和查询订单状态的地方调用这两个函数就可以了
def alipay_pay(request):
# 获得订单id
order_id = request.GET.get('order_id')
print(order_id)
try:
# 查询商品表
order = OrderInfo.objects.get(pk=order_id)
except:
return JsonResponse({"result":"订单编号错误"})
# 生成订单,返回订单url
url = get_alipay_page(order_id,order.total_amount)
return JsonResponse({"url":url})
def alipay_query(request):
order_id = request.GET.get('order_id')
result = get_alipay_query(order_id)
if result:
try:
order=OrderInfo.objects.get(pk=order_id)
except:
return JsonResponse({'result':'失败'})
# 支付成功就修改订单为代发货
order.status = 2
order.save()
return JsonResponse({"result":1})
else:
return JsonResponse({"result":2})