python调用支付宝接口

张宝*

python

项目描述

python调用支付宝沙箱模式接口

上传时间

2020.06.27

浏览人数

1188人
张宝*
天津市红桥区
Hot:5004

开发者可以根据自身需求,先在沙箱环境中了解、组合和调试各种开放接口,进行开发调通工作。支付宝沙箱环境是协助开发者进行接口功能开发及主要功能联调的辅助环境。沙箱环境模拟了开放平台部分产品的主要功能和主要逻辑。

进行调用沙箱环境接口之前,需要以下几个步骤:

1.  开通支付宝沙箱环境

沙箱环境地址:https://openhome.alipay.com/platform/appDaily.htm?tab=info

访问上面url,支付宝扫码登录,实名认证,根据提示创建应用,生成相应的沙箱应用环境。

python调用支付宝接口

2.  下载密钥生成工具(支付宝开放平台开发助手)

3.  生成RSA2(SHA256)的应用公钥

python调用支付宝接口

4.  点击打开文件位置后分别给 阿里公钥 app密钥  app公钥改成如下名称,在django项目建立文件夹并保存到其中中,在密钥加上首尾如下图所示:

python调用支付宝接口

python调用支付宝接口

 

下图ali为你新建文件夹名称

python调用支付宝接口

5.  下载支付宝沙箱app,如下图位置找到商家以及支付账号的用户名和密码登录沙箱app。

python调用支付宝接口

 

下面是django项目中views代码演示

1.  views.py

2.  import time
from urllib.parse import parse_qs
from django.shortcuts import render, redirect, HttpResponse
from django.views.decorators.csrf import csrf_exempt
from ali.alipay import AliPay
from django.conf import settings


def aliPay():
    obj = AliPay(
       
# 支付宝沙箱里面的APPID,需要改成你自己的
       
appid="    ",
       
# 如果支付成功,支付宝会向这个地址发送POST请求(校验是否支付已经完成),此地址要能够在公网进行访问,需要改成你自己的服务器地址
       
app_notify_url=" ",
       
# 如果支付成功,重定向回到你的网站的地址。需要自己改
       
return_url="   ",
       
alipay_public_key_path=settings.ALIPAY_PUBLIC# 支付宝公钥
       
app_private_key_path=settings.APP_PRIVATE# 应用私钥
       
debug=True,  # 默认False,True表示使用沙箱环境测试
   
)
   
return obj


@csrf_exempt
def index(request):
   
if request.method == "GET":
       
return render(request, 'home.html')

   
# 实例化SDK里面的类AliPay
   
alipay = aliPay()

   
# 对购买的数据进行加密
   
money = float(request.POST.get('price'))  # 保留俩位小数  前端传回的数据
   
out_trade_no = "x2" + str(time.time())  # 商户订单号   # 订单号可以有多中生成方式,可以百度一下
    # 1. 在数据库创建一条数据:状态(待支付)
   
query_params = alipay.direct_pay(
       
subject="商品名"# 商品简单描述 这里一般是从前端传过来的数据
       
out_trade_no=out_trade_no# 商户订单号  这里一般是从前端传过来的数据
       
total_amount=money# 交易金额(单位: 元 保留俩位小数)   这里一般是从前端传过来的数据
   
)
   
# 拼接url,转到支付宝支付页面
   
pay_url = "https://openapi.alipaydev.com/gateway.do?{}".format(query_params)

   
print(pay_url)
   
return redirect(pay_url)


@csrf_exempt
def update_order(request):
   
"""
   
支付成功后,支付宝向该地址发送的POST请求(用于修改订单状态)
    :param request:
    :return:
    """
   
if request.method == 'POST':
        body_str = request.body.decode(
'utf-8')
        post_data = parse_qs(body_str)
        post_dict = {}
       
for k, v in post_data.items():
            post_dict[k] = v[
0]
        alipay = aliPay()
        sign = post_dict.pop(
'sign', None)
        status = alipay.verify(post_dict
, sign)
       
if status:
           
# 1.修改订单状态
            out_trade_no
= post_dict.get('out_trade_no')
           
# 2. 根据订单号将数据库中的数据进行更新
           
return HttpResponse('支付成功')
       
else:
           
return HttpResponse('支付失败')
   
return HttpResponse('')


@csrf_exempt
def pay_result(request):
   
"""
   
支付完成后,跳转回的地址
    :param request:
    :return:
    """
   
params = request.GET.dict()
    sign = params.pop(
'sign', None)
    alipay = aliPay()
    status = alipay.verify(params
, sign)
   
if status:
       
return HttpResponse('支付成功1')
   
return HttpResponse('支付失败1')


 

3.  url

python调用支付宝接口

4.  ali.py

5.  from datetime import datetime
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
from urllib.parse import quote_plus
from base64 import decodebytes, encodebytes
import json


class AliPay(object):
   
"""
   
支付宝支付接口(PC端支付接口)
    """

   
def __init__(self, appid, app_notify_url, app_private_key_path,
                
alipay_public_key_path, return_url, debug=False):
       
self.appid = appid
       
self.app_notify_url = app_notify_url
       
self.app_private_key_path = app_private_key_path
       
self.app_private_key = None
       
self.return_url = return_url
        
with open(self.app_private_key_path) as fp:
           
self.app_private_key = RSA.importKey(fp.read())
       
self.alipay_public_key_path = alipay_public_key_path
       
with open(self.alipay_public_key_path) as fp:
           
self.alipay_public_key = RSA.importKey(fp.read())

       
if debug is True:
           
self.__gateway = "https://openapi.alipaydev.com/gateway.do"
       
else:
           
self.__gateway = "https://openapi.alipay.com/gateway.do"

   
def direct_pay(self, subject, out_trade_no, total_amount, return_url=None, **kwargs):
        biz_content = {
           
"subject": subject,
           
"out_trade_no": out_trade_no,
           
"total_amount": total_amount,
           
"product_code": "FAST_INSTANT_TRADE_PAY",
           
# "qr_pay_mode":4
       
}

        biz_content.update(kwargs)
        data =
self.build_body("alipay.trade.page.pay", biz_content, self.return_url)
       
return self.sign_data(data)

   
def build_body(self, method, biz_content, return_url=None):
        data = {
           
"app_id": self.appid,
           
"method": method,
           
"charset": "utf-8",
           
"sign_type": "RSA2",
           
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
           
"version": "1.0",
           
"biz_content": biz_content
        }

       
if return_url is not None:
            data[
"notify_url"] = self.app_notify_url
            data[
"return_url"] = self.return_url

       
return data

   
def sign_data(self, data):
        data.pop(
"sign", None)
       
# 排序后的字符串
       
unsigned_items = self.ordered_data(data)
        unsigned_string =
"&".join("{0}={1}".format(k, v) for k, v in unsigned_items)
        sign =
self.sign(unsigned_string.encode("utf-8"))
       
# ordered_items = self.ordered_data(data)
       
quoted_string = "&".join("{0}={1}".format(k, quote_plus(v)) for k, v in unsigned_items)

       
# 获得最终的订单信息字符串
       
signed_string = quoted_string + "&sign=" + quote_plus(sign)
       
return signed_string

   
def ordered_data(self, data):
        complex_keys = []
       
for key, value in data.items():
           
if isinstance(value, dict):
                complex_keys.append(key)

       
# 将字典类型的数据dump出来
       
for key in complex_keys:
            data[key] = json.dumps(data[key]
, separators=(',', ':'))

       
return sorted([(k, v) for k, v in data.items()])

   
def sign(self, unsigned_string):
       
# 开始计算签名
       
key = self.app_private_key
        signer = PKCS1_v1_5.new(key)
        signature = signer.sign(SHA256.new(unsigned_string))
       
# base64 编码,转换为unicode表示并移除回车
       
sign = encodebytes(signature).decode("utf8").replace("\n", "")
       
return sign

   
def _verify(self, raw_content, signature):
       
# 开始计算签名
       
key = self.alipay_public_key
        signer = PKCS1_v1_5.new(key)
        digest = SHA256.new()
        digest.update(raw_content.encode(
"utf8"))
       
if signer.verify(digest, decodebytes(signature.encode("utf8"))):
           
return True
        return False

    def
verify(self, data, signature):
       
if "sign_type" in data:
           
sign_type = data.pop("sign_type")
       
# 排序后的字符串
       
unsigned_items = self.ordered_data(data)
        message =
"&".join(u"{}={}".format(k, v) for k, v in unsigned_items)
       
return self._verify(message, signature)

 


张宝*

当前作品暂无评分

还未获得评语哦~
python python培训 天津python培训 python培训班 python培训多少钱 Django 天津python培训班 天津python培训 天津python培训机构。天津python培训学什么? python python培训 天津python培训 Mysql django Numpy flask anaconda 天津python培训 天津python培训班 python培训 python 天津python培训 天津python培训班 数据爬虫 爬虫技术 python爬虫 python 天津python培训 python培训 python PyCharm Eclipse + 天津python培训 python培训 python PyCharm Eclipse + PyDev python培训 天津python培训 python培训班 python培训多少钱 PyCharm Eclipse + PyDev visual studio 天津python培训 天津python培训班 PyCharm Eclipse + PyDev visual studio 天津python培训 天津python培训班 天津python培训机构 python培训班 C/C++ Java Python 天津python培训 天津python培训班 天津python培训机构 python培训班 C/C++ Java Python 天津python培训 天津python培训班 天津python培训机构 python培训班 C/C++ Java Python 天津python培训 天津python培训班 天津python培训机构 python培训班 C/C++ Java Python 天津python培训 天津python培训班 天津python培训机构 python培训班 python java web 天津python培训 天津python培训哪家好 天津python培训机构 天津python培训班 python java web前端 天津python培训 天津python培训班 天津python培训机构 天津python培训学校 python java web 天津python培训 天津python培训班 天津python培训机构 python培训 python java web 天津python培训 天津python培训班 天津python培训机构 天津python培训学校 python java web 天津python培训 天津python培训班 天津python培训机构 python java web 天津python培训 天津python培训班 天津python培训机构 天津python培训学校 python Java web 天津python培训 天津python培训学校 天津python培训机构 天津python培训班 python java web 天津python培训 天津python培训班 天津python培训机构 python培训 python Java web 天津python培训 天津python培训机构 天津python培训班 python培训 python java web 天津python培训 天津python培训机构 天津python培训学校 python培训 python java web 天津python培训 天津python培训班 天津python培训机构 python培训 python java web 天津python培训 天津python培训班 天津python培训机构 python培训 python java web 天津python培训 天津python培训班 天津python培训机构 python培训学校 python java web 天津python培训 天津python培训机构 python培训班 python java web 天津Java培训 天津Java培训班 Java培训 天津Java培训机构 python web java 天津python培训 天津python培训班 天津python培训机构 python java web 天津python培训 天津python培训班 python培训 天津python培训机构 python java web 天津python培训 天津python培训班 天津python培训机构 python培训 python web java 天津python培训 天津python培训班 python培训 python web java 天津python培训 天津python培训班 python培训 python web java 天津python培训 天津python培训机构 天津python培训学校 python web java 天津python培训班 天津python培训机构 天津python培训学校 python java web 天津python培训 天津python培训机构 python培训 python web java 天津python培训 天津python培训班 python培训 python web java 天津python培训 天津python培训机构 python培训 python web java 天津python培训 天津python培训班 python培训 python web java 天津python培训 天津python培训班
张宝*    5004 天津市红桥区 设计师杨冰是女孩 1994.**.**
本网站已在中国版权保护中心登记了美术作品著作权与软件著作权违者将依法追究责任,特此声明! | Copyright©2013-2022,zhuzuoji.com | 诚筑说培训学校(天津)有限公司内容支持 | 京ICP备17020986号-5