一、初始工作
首先注册一个沙箱,获取测试用的商家与买家账户以及app_id和各种公私钥。
直接pip安装支付宝的SDK,我用的django是4.2版本,最新版。
二、简化代码
支付宝SDK提供的实例是直接可以用,简化一下去除不必要的导入:
#!/usr/bin/env python# -*- coding: utf-8 -*-importloggingfromalipay.aop.api.AlipayClientConfigimportAlipayClientConfigfromalipay.aop.api.DefaultAlipayClientimportDefaultAlipayClientfromalipay.aop.api.domain.AlipayTradePagePayModelimportAlipayTradePagePayModelfromalipay.aop.api.request.AlipayTradePagePayRequestimportAlipayTradePagePayRequest# 应用私钥、支付宝公钥fromuser.pay.alipay_keysimportALIPAY_PUBLIC_KEY, APP_PRIVATE_KEY, APP_ID, APP_GATEWAYlogging.basicConfig( level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s', filemode='a', ) logger=logging.getLogger('') classAlipayClient: def__init__(self): alipay_client_config=AlipayClientConfig() alipay_client_config.server_url=APP_GATEWAYalipay_client_config.app_id=APP_IDalipay_client_config.app_private_key=APP_PRIVATE_KEYalipay_client_config.alipay_public_key=ALIPAY_PUBLIC_KEYself.client=DefaultAlipayClient(alipay_client_config=alipay_client_config, logger=logger) defcreate_alipay(self, out_trade_on, amount, subject, body, time_expire): """ out_trade_on:订单号 amount:价格 subject: 标题 body: 描述 """# 对照接口文档,构造请求对象model=AlipayTradePagePayModel() # 商户订单model.out_trade_no=out_trade_on# 订单总金额,单位为元,精确到小数点后两位model.total_amount=amount# 标题model.subject=subject# 超时5分钟model.time_expire=time_expire# 商品描述model.body=bodymodel.product_code="FAST_INSTANT_TRADE_PAY"request=AlipayTradePagePayRequest(biz_model=model) request.notify_url="https://www.***.cn/user/verify/"request.return_url="https://www.***.cn/user/profile/"# 得到构造的请求,如果http_method是GET,则是一个带完成请求参数的url,如果http_method是POST,则是一段HTML表单片段response=self.client.page_execute(request, http_method="GET") returnresponse
公共参数里面传入公私钥,应用id和支付宝网关即可,请求体里面我们只需要,准备订单号,价格,标题即可,描述可有可无,请求方式我选的是GET,就是直接跳转到支付宝付款页面。
三、创建订单
我们在其他视图可以直接是实例化,然后调用create_alipay方法
client=AlipayClient() resp=client.create_alipay(out_trade_on=order_id, amount=amount, subject=subject, body=body, time_expire=time_expire)
支付成功之后,如果不关闭支付宝页面会自动跳转到return_url填写的地址然后携带一系列参数,然后同样的参数还会以POST的形式请求到notify_url填写的地址,然后我们需要在notify_url这个地址进行验签,就是判断用户是否真正支付成功。
三、支付验签
验签使用支付宝SDK里面的:verify_with_rsa方法
fromalipay.aop.api.util.SignatureUtilsimportverify_with_rsa
verify_with_rsa:接受三个参数(支付宝公钥,message,sign)
message就是POST传过来的所有参数,sign包含在里面,将POST所有参数组合成字典的形式,将sign和sign_type提取出来,不能留在字典中,剩下的就是message,然后传递给verify_with_rsa,返回True就是验签成功,表示支付成功。
四、组合参数
这是我写的组合message的函数,可直接用:
defget_dic_sorted_params(org_dic_params): content=''org_dic_params.pop('sign') org_dic_params.pop('sign_type') # 去除sign、sigh_typenew_list=sorted(org_dic_params, reverse=False) # 待验签参数进行排序foriinnew_list: p=i+'='+org_dic_params.get(i) +'&'content+=psorted_params=content.strip('&') # 重组字符串,将{k:v}形式的字典类型原始响应值--》转换成'k1=v1&k2=v2'形式的字符串格式returnsorted_params
到这里支付宝电脑支付就完成了。