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})