这篇博客主要是描述一下在调用支付宝的时候的一个通用方法.首先需要
1.一对公钥,私钥
2.自己支付宝账号的APPID与支付宝网关,获取网站:https://openhome.alipay.com/platform/appDaily.htm?tab=info
然后把公钥填在上面的网站中,这样就可以使用支付宝的接口了
在django中开始调用支付宝:
1.setting配置:
ALIPAY_APPID = 20xxxxxxxxxxxxx9999
ALIPAY_URL = "https://openapi.alipaydev.com/gateway.do"
WEB_URL = "http://127.0.0.1:8000/" #这个是方便上线的时候只需要改这一项,然后所有的链接重定向的时候就都走这个url,防止bug
2.pip安装
pip install python-alipay-sdk
3.支付代码
class PayView(View):
def get(self, request): #通过一个类的get方法来调用支付宝,如果是post方法,如果在支付宝界面还尚未打开就刷新页面,会出现表单重新填写等问题.
from alipay import AliPay
import os
from Myweb.settings import ALIPAY_APPID, BASE_DIR, ALIPAY_URL, WEB_URL
buy_id = request.GET.get("id", "")#这里的"id"是我自定义的业务逻辑
if id:
buy_model = BuyersModel.objects.filter(buy_id=buy_id) #buy_model是自定义数据库的表
if buy_model:
buy_model = buy_model.get(buy_id=buy_id)
money = buy_model.buy_money # 根据数据库中的id查询需要支付的金额
ali_pay = AliPay(
appid=ALIPAY_APPID,
app_notify_url=None, # 使用默认回调的地址
# 私钥的路径
app_private_key_path=os.path.join(BASE_DIR, 'keys/pri'),
# 公钥的路径
alipay_public_key_path=os.path.join(BASE_DIR, 'keys/pub'),
# 使用的加密方式
sign_type='RSA2',
# 默认是False测试环境配合沙箱环境使用 如果是生产环境将其改为True
debug=True)
order_string = ali_pay.api_alipay_trade_page_pay(
# 订单编号
out_trade_no=buy_id,
# 订单总额
total_amount=money,
# 订单描述信息
subject="Thank you for your support !",
# 回调地址, 订单支付成功后回调的地址
return_url=WEB_URL + "hire/pay_finish?id=" + buy_id, # 这里是自己网站的一个支付成功的页面.
)
url = ALIPAY_URL + '?' + order_string
from django.http import HttpResponseRedirect
return HttpResponseRedirect(url)
else: # 如果在支付中出现任何缺陷,很多都是恶意输入数据,可以直接返回404的页面,表示信息缺失.
return page_not_fount(request)
else:
page_not_fount(request)
4.是否支付的验证类:
class PayOkView(View):
def get(self, request):
out_trade_no = request.GET.get("out_trade_no", "") # 这里的out_trade_no是订单编号
id = request.GET.get("id", "")
if id is "":
return page_not_fount(request)
from alipay import AliPay
from Myweb.settings import ALIPAY_APPID, BASE_DIR
import os
alipay = AliPay(
appid=ALIPAY_APPID,
app_notify_url=None,
app_private_key_path=os.path.join(BASE_DIR, 'keys/pri'),
alipay_public_key_path=os.path.join(BASE_DIR, 'keys/pub'),
sign_type='RSA2',
# 沙箱环境下没有查询订单服务的
debug=True)
response = alipay.api_alipay_trade_query(out_trade_no=out_trade_no)
# code 40004 支付订单未创建
# code 10000 trade_status WAIT_BUYER_PAY 等待支付
# oode 10000 trade_status TRADE_SUCCESS 支付成功
# response 是字典
code = response.get('code')
trade_status = response.get('trade_status')
if code == '10000' and trade_status == 'TRADE_SUCCESS':
# 支付成功
# has_pay
#支付成功的
elif (code == '10000' and trade_status == 'WAIT_BUYER_PAY') or code == '40004':
# 表示支付暂时没有完成
from django.http import HttpResponseRedirect
return HttpResponseRedirect(支付未完成的url)
else:
# fail
from django.http import HttpResponseRedirect
return HttpResponseRedirect(其他支付失败情况的url)
具体的资金余额在沙箱模式下可以通过https://openhome.alipay.com/platform/appDaily.htm?tab=account 来查看