如何使用Python实现支付宝在线支付?商家:我人傻了

2023-05-16

如何使用Python实现支付宝在线支付?商家:我人傻了

 

windows系统安装Python虚拟环境

首先保证你的系统已经安装好了Python

安装virtualenv

C:\WINDOWS\system32>pip3 install virtualenv
Collecting virtualenv
  Downloading virtualenv-15.1.0-py2.py3-none-any.whl (1.8MB)
    100% |████████████████████████████████| 1.8MB 110kB/s
Installing collected packages: virtualenv
Successfully installed virtualenv-15.1.0

C:\WINDOWS\system32>

安装virtualenvwrapper

virtualenvwrapper是virtualenv的一个方便管理虚拟环境的管理器

pip3 install virtualenvwrapper

指定虚拟环境,保存路径

首先在要保存虚拟环境的地方创建一个Evns目录,然后将这个目录添加到系统环境变量,以后创建的虚拟环境就会保存在这个目录,重启系统后生效

如何使用Python实现支付宝在线支付?商家:我人傻了

 

创建虚拟环境,创建后会自动进入虚拟环境

mkvirtualenv 虚拟环境名称

[root@192 xu_ni_huan_jing]# mkvirtualenv jxiou
Using base prefix '/usr/local'
New python executable in /usr/xu_ni_huan_jing/jxiou/bin/python3.5
Also creating executable in /usr/xu_ni_huan_jing/jxiou/bin/python
Installing setuptools, pip, wheel...done.
virtualenvwrapper.user_scripts creating /usr/xu_ni_huan_jing/jxiou/bin/predeactivate
virtualenvwrapper.user_scripts creating /usr/xu_ni_huan_jing/jxiou/bin/postdeactivate
virtualenvwrapper.user_scripts creating /usr/xu_ni_huan_jing/jxiou/bin/preactivate
virtualenvwrapper.user_scripts creating /usr/xu_ni_huan_jing/jxiou/bin/postactivate
virtualenvwrapper.user_scripts creating /usr/xu_ni_huan_jing/jxiou/bin/get_env_details
(jxiou) [root@192 xu_ni_huan_jing]# 

5.退出虚拟环境

deactivate

(jxiou) [root@192 xu_ni_huan_jing]# deactivate
[root@192 xu_ni_huan_jing]# 

6.查看有哪些虚拟环境

workon

[root@192 /]# workon
jxiou2
jxiou
[root@192 /]# 

7.进入一个指定的虚拟环境

workon jxiou(虚拟环境名称)

[root@192 /]# workon jxiou
(jxiou) [root@192 /]#

8.虚拟环境创建好后,创建Django项目,创建好数据库,开始本地调试支付请求

支付宝接口集成 ,本地环境调试支付请求

1。首先登录 蚂蚁金服网站,也就是支付宝开发者平台

登录蚂蚁金服开发者平台后,创建沙箱应用

如何使用Python实现支付宝在线支付?商家:我人傻了

 

也就是支付宝给开发者提供的调试环境应用

如何使用Python实现支付宝在线支付?商家:我人傻了

 

注意这里我们一定选择RSA2(SHA256)密钥(推荐),这个是比较安全的方式,


2.我们设置应用公钥

设置公钥,访问
https://docs.open.alipay.com/291/105971/ 这个网址

下载生成公钥的工具

如何使用Python实现支付宝在线支付?商家:我人傻了

 

下载解压后

如何使用Python实现支付宝在线支付?商家:我人傻了

 

生成公钥

如何使用Python实现支付宝在线支付?商家:我人傻了

 

生成公钥后会得到两个文件

如何使用Python实现支付宝在线支付?商家:我人傻了

 

注意:这两个文件很重要一定要保存好

 

生成公钥后,将公钥填写到信息配置里

如何使用Python实现支付宝在线支付?商家:我人傻了

 

如何使用Python实现支付宝在线支付?商家:我人傻了

 

如何使用Python实现支付宝在线支付?商家:我人傻了

 

当我们填写好公钥保存后,会自动给我们生成支付宝公钥

如何使用Python实现支付宝在线支付?商家:我人傻了

 

将生成的支付宝公钥,复制下载写在一个TXT文件里

这样我们就有了3个秘钥

如何使用Python实现支付宝在线支付?商家:我人傻了

 

将3个秘钥修改成英文或者拼音名称后,放到网站项目中

如何使用Python实现支付宝在线支付?商家:我人傻了

 

在秘钥txt文件里,秘钥内容的头部和结尾加上两行字符串,注意所有秘钥都要加

-----BEGIN PRIVATE KEY-----
秘钥内容....
-----END PRIVATE KEY-----

如何使用Python实现支付宝在线支付?商家:我人傻了

 

3.支付宝,支付集成代码

#!/usr/bin/env python
# -*- coding:utf8 -*-

# pip install pycryptodome   需要模块加密方面的模块
__author__ = 'bobby'

from datetime import datetime
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
from base64 import b64encode, b64decode
from urllib.parse import quote_plus
from urllib.parse import urlparse, parse_qs
from urllib.request import urlopen
from base64 import decodebytes, encodebytes

import json


class AliPay(object):
    """
    支付宝支付接口
    """
    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.import_key(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 ordered_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)


if __name__ == "__main__":
    """支付请求过程"""
    # 传递参数初始化支付类
    alipay = AliPay(
        appid="2016080800192023",                                   # 设置签约的appid
        app_notify_url="http://projectsedus.com/",                  # 异步支付通知url
        app_private_key_path=u"ying_yong_si_yao.txt",               # 设置应用私钥
        alipay_public_key_path="zhi_fu_bao_gong_yao.txt",           # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
        debug=True,  # 默认False,                                   # 设置是否是沙箱环境,True是沙箱环境
        return_url="http://47.92.87.172:8000/"                      # 同步支付通知url
    )

    # 传递参数执行支付类里的direct_pay方法,返回签名后的支付参数,
    url = alipay.direct_pay(
        subject="测试订单",                              # 订单名称
        # 订单号生成,一般是当前时间(精确到秒)+用户ID+随机数
        out_trade_no="201702021225",                    # 订单号
        total_amount=100,                               # 支付金额
        return_url="http://47.92.87.172:8000/"          # 支付成功后,跳转url
    )
    
    # 将前面后的支付参数,拼接到支付网关
    # 注意:下面支付网关是沙箱环境,
    re_url = "https://openapi.alipaydev.com/gateway.do?{data}".format(data=url)
    print(re_url)
    # 最终进行签名后组合成支付宝的url请求

如何使用Python实现支付宝在线支付?商家:我人傻了

 

4.生成支付URL后,我们用这个URL模拟支付一下

注意:沙箱环境,支付的时候要用沙箱账号里提供的支付账号才可以支付

如何使用Python实现支付宝在线支付?商家:我人傻了

 

支付成功后已经,跳转到我们设置的同步处理页面

如何使用Python实现支付宝在线支付?商家:我人傻了

 

5.支付宝支付成功后通过接口验证

#!/usr/bin/env python
# -*- coding:utf8 -*-

# pip install pycryptodome   需要模块加密方面的模块
__author__ = 'bobby'

from datetime import datetime
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
from base64 import b64encode, b64decode
from urllib.parse import quote_plus
from urllib.parse import urlparse, parse_qs
from urllib.request import urlopen
from base64 import decodebytes, encodebytes

import json


class AliPay(object):
    """
    支付宝支付接口
    """
    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.import_key(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 ordered_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)


if __name__ == "__main__":
    """支付宝支付成功后通知接口验证"""

    # 接收支付宝支付成功后,向我们设置的同步支付通知url,请求的参数
    return_url = 'http://47.92.87.172:8000/?total_amount=100.00×tamp=2017-10-11+22%3A44%3A17&sign=dHW%2F25EDd%2BYKqkU5krhseDNIOEyDpdJzSAaoqhTC0nlv8%2FEmrQVd0WqgGK0CS8Pax8sK4jIOdGLFa6lQEbIfzvH3Na2W949yCAYX04JL1Bi02wog7a8L7vfW9Kj%2BjfTQxumGH%2B1Drbezdg9gKOx3tX0cb1yBBdfifK6l1%2BE5UjggGbY60F6SD8A8XI06NMWb4ViU%2FLYtBhwAwU2koy1IK2%2BtBJM1xYFuBRlcWF61xCxexHwO0WEA3AwVRW1miuJjOpGiBTOwPI9Huj0WhkyRebIjBhSxReJdZIdTfAgwj4oqo4jAJCHDa6DKBM0H3wjKKXSyMeMBGKQB0Uv2rNdyng%3D%3D&trade_no=2017101121001004320200174640&sign_type=RSA2&auth_app_id=2016080800192023&charset=utf-8&seller_id=2088102170418468&method=alipay.trade.page.pay.return&app_id=2016080800192023&out_trade_no=201702021227&version=1.0'

    # 将同步支付通知url,传到urlparse
    o = urlparse(return_url)
    # 获取到URL的各种参数
    query = parse_qs(o.query)
    # 定义一个字典来存放,循环获取到的URL参数
    processed_query = {}
    # 将URL参数里的sign字段拿出来
    ali_sign = query.pop("sign")[0]

    # 传递参数初始化支付类
    alipay = AliPay(
        appid="2016080800192023",                                   # 设置签约的appid
        app_notify_url="http://projectsedus.com/",                  # 异步支付通知url
        app_private_key_path=u"ying_yong_si_yao.txt",               # 设置应用私钥
        alipay_public_key_path="zhi_fu_bao_gong_yao.txt",           # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
        debug=True,  # 默认False,                                   # 设置是否是沙箱环境,True是沙箱环境
        return_url="http://47.92.87.172:8000/"                      # 同步支付通知url
    )

    # 循环出URL里的参数
    for key, value in query.items():
        # 将循环到的参数,以键值对形式追加到processed_query字典
        processed_query[key] = value[0]
    # 将循环组合的参数字典,以及拿出来的sign字段,传进支付类里的verify方法,返回验证合法性,返回布尔值,True为合法,表示支付确实成功了,这就是验证是否是伪造支付成功请求
    print(alipay.verify(processed_query, ali_sign))

# 如果别人伪造支付成功请求,它不知道我们的支付宝公钥,伪造的就无法通过验证,测试可以将支付宝公钥更改一下,在验证就会失败,别忘了改回来

如何使用Python实现支付宝在线支付?商家:我人傻了

 

远程测试支付成功后返回服务器验证

首先准备一台服务器,将开发环境和项目同步到服务器上,并且在服务器上配置好python虚拟环境和所需python插件包

 

项目同步到服务器上,也就是将本地项目,上传到服务器进行同步

如何使用Python实现支付宝在线支付?商家:我人傻了

 

配置服务器信息

如何使用Python实现支付宝在线支付?商家:我人傻了

 

2

如何使用Python实现支付宝在线支付?商家:我人傻了

 

上传项目

如何使用Python实现支付宝在线支付?商家:我人傻了

 


数据上传后,在服务器配置数据库访问权限,和配置python环境

 

配置远程调试

1,在阿里云后台,开放8000端口

如何使用Python实现支付宝在线支付?商家:我人傻了

 

2,在服务器开发8000端口

vim /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#添加配置项
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8000 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

重启防火墙

service iptables restart

设置当前,使用的数据库用户,可以任意ip访问

让数据库用户可以从外部登陆和本地登陆

1

grant all privileges(除授权外的所有权限) on *.*(表示所有数据库的所有表) to 'test_user(授权的用户名)'@'localhost(授权ip)' identified by 'test_user(用户密码)';

grant all privileges on *.* to 'test_user'@'localhost' identified by 'test_user';

2

grant all privileges(除授权外的所有权限) on *.*(表示所有数据库的所有表) to 'test_user(授权的用户名)'@'%(所有ip)' identified by 'test_user(用户密码)';

grant all privileges on *.* to 'test_user'@'%' identified by 'test_user';

配置项目的settings.py文件

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',       #配置数据库引擎名称
        'NAME': 'jxiou',                            #数据库名称
        'USER': 'test_user',                             #数据库用户名
        'PASSWORD': 'test_user',                       #数据库密码
        'HOST': '47.52.39.160',                        #数据库链接地址,为服务器ip
        'PORT': '3306',                             #数据库端口
    }
}

2

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['*']   # 允许任意ip访问项目

开始远程调试

如何使用Python实现支付宝在线支付?商家:我人傻了

 

2

如何使用Python实现支付宝在线支付?商家:我人傻了

 

3

如何使用Python实现支付宝在线支付?商家:我人傻了

 

4

如何使用Python实现支付宝在线支付?商家:我人傻了

 

5

如何使用Python实现支付宝在线支付?商家:我人傻了

 

此时,就可以用服务器ip加8000端口,访问服务器网站了

如何使用Python实现支付宝在线支付?商家:我人傻了

 

前面,我们在本地调试了支付宝支付请求,这下我们要调试,支付宝支付成功后向我们服务器返回请求我们要验证返回的请求,,所以需要将远程服务器启动来,接收支付宝的返回

settings.py

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# 支付宝目录路径设置
ying_yong_si_yao = os.path.join(BASE_DIR, 'app1/alipay/ying_yong_si_yao.txt')
zhi_fu_bao_gong_yao = os.path.join(BASE_DIR, 'app1/alipay/zhi_fu_bao_gong_yao.txt')

urls.py


   

views.py

#!/usr/bin/env python
# -*- coding:utf8 -*-
from django.shortcuts import render

# Create your views here.
from django.shortcuts import render,HttpResponse
from django.views.decorators.csrf import csrf_exempt,csrf_protect

from app1.alipay.alipay import AliPay
from jxiou.settings import ying_yong_si_yao, zhi_fu_bao_gong_yao

@csrf_exempt
def alipaview(request):
    if request.method == "GET":
        processed_dict = {}  # 接收支付宝传递参数
        for key, value in request.GET.items():  # 循环参数
            processed_dict[key] = value  # 将参数添加到字典
        sign = processed_dict.pop('sign', None)  # 单独拿出sign字段

        # 传递参数初始化支付类
        alipay = AliPay(
            appid="2016080800192023",  # 设置签约的appid
            app_notify_url="http://47.52.39.160:8000/alipa/",  # 异步支付通知url
            app_private_key_path=ying_yong_si_yao,  # 设置应用私钥
            alipay_public_key_path=zhi_fu_bao_gong_yao,  # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=True,  # 默认False,                                   # 设置是否是沙箱环境,True是沙箱环境
            return_url="http://47.52.39.160:8000/alipa/"  # 同步支付通知url,跳转地址
        )

        # 验证支付宝返回的合法性
        yan_zhen = alipay.verify(processed_dict, sign)
        if yan_zhen is True:  # 判断如果合法
            out_trade_no = processed_dict.get('out_trade_no', None)  # 商户订单号
            trade_no = processed_dict.get('trade_no', None)  # 支付宝交易号
            buyer_id = processed_dict.get('buyer_id', None)  # 买家支付宝用户号
            trade_status = processed_dict.get('trade_status', None)  # 交易状态
            total_amount = processed_dict.get('total_amount', None)  # 订单金额
            receipt_amount = processed_dict.get('receipt_amount', None)  # 实收金额
            subject = processed_dict.get('subject', None)  # 订单标题
            gmt_payment = processed_dict.get('gmt_payment', None)  # 交易付款时间

            # 数据库操作
            print(out_trade_no)
            print(trade_no)
            print(buyer_id)
            print(trade_status)
            print(total_amount)
            print(receipt_amount)
            print(subject)
            print(gmt_payment)

            # 向支付宝返回success,告诉他我们已经处理,不然他会不停的通知
            return HttpResponse('success')

    if request.method == "POST":                        # post请求支付宝异步通知
        processed_dict = {}                             # 接收支付宝传递参数
        for key, value in request.POST.items():         # 循环参数
            processed_dict[key] = value                 # 将参数添加到字典
        sign = processed_dict.pop('sign', None)         # 单独拿出sign字段

        # 传递参数初始化支付类
        alipay = AliPay(
            appid="2016080800192023",                                   # 设置签约的appid
            app_notify_url="http://47.52.39.160:8000/alipa/",           # 异步支付通知url
            app_private_key_path=ying_yong_si_yao,                      # 设置应用私钥
            alipay_public_key_path=zhi_fu_bao_gong_yao,                 # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
            debug=True,  # 默认False,                                   # 设置是否是沙箱环境,True是沙箱环境
            return_url="http://47.52.39.160:8000/alipa/"                # 同步支付通知url
        )

        # 验证支付宝返回的合法性
        yan_zhen = alipay.verify(processed_dict, sign)
        if yan_zhen is True:                                                # 判断如果合法
            out_trade_no = processed_dict.get('out_trade_no', None)         # 商户订单号
            trade_no = processed_dict.get('trade_no', None)                 # 支付宝交易号
            buyer_id = processed_dict.get('buyer_id', None)                 # 买家支付宝用户号
            trade_status = processed_dict.get('trade_status', None)         # 交易状态
            total_amount = processed_dict.get('total_amount', None)         # 订单金额
            receipt_amount = processed_dict.get('receipt_amount', None)     # 实收金额
            subject = processed_dict.get('subject', None)                   # 订单标题
            gmt_payment = processed_dict.get('gmt_payment', None)           # 交易付款时间

            # 数据库操作
            print(out_trade_no)
            print(trade_no)
            print(buyer_id)
            print(trade_status)
            print(total_amount)
            print(receipt_amount)
            print(subject)
            print(gmt_payment)

            # 向支付宝返回success,告诉他我们已经处理,不然他会不停的通知
            return HttpResponse('success')

WAIT_BUYER_PAY 交易创建,等待买家付款
TRADE_CLOSED 未付款交易超时关闭,或支付完成后全额退款
TRADE_SUCCESS 交易支付成功
TRADE_FINISHED 交易结束,不可退款

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用Python实现支付宝在线支付?商家:我人傻了 的相关文章

  • 每次在boot下建立ssh空文件就会被删掉,wpa_supplicant.conf 文件也会自动被删除,为什么?

    A 开启ssh 和 配置WiFi 注意2 xff1a 我知道你可能没有路由器 xff0c 你也可以用电脑开启WiFi热点 xff0c 然后在热点管理那里找到你树莓派的IP地址 如果你没有给树莓派现在就连接屏幕的想法 xff0c 第一次启动O
  • Jetson查看JetPack版本(tool)

    Jetson查看JetPack版本 查看L4T版本 我的L4T版本为 32 5 1 在官网查找对应的jetpack版本 This page includes access to previously released versions of
  • ros中设置Global Options,以及rqt_tf_tree树讲解,TF树的理解,使用GUI插件,用于可视化ROS-TF的框架树

    一 设置Global Options 如图30 启动rviz界面后 首先要对Global Options进行设置 Global Options里面的参数是一些全局显示相关的参数 其中的Fixed Frame参数是全局显示区域依托的坐标系 我
  • jetson xavier和NX 以及nano如何通过sd卡启动,sdkManager刷机

    1 xff0c xavier可以通过迁移系统的方法进行 Jetson AGX Xavier从SD卡启动系统及系统移植 xavier AGX不能直接使用sdkManager刷机到SD卡 xff0c 所以需要用系统迁移的方法 2 xff0c N
  • Linux NameSpace (目录)

    1 User Namespace 详解 2 Pid Namespace 详解 3 Mnt Namespace 详解 4 UTS Namespace 详解 5 IPC Namespace 详解 6 Network Namespace 详解
  • Python Nose 自动化测试框架介绍

    文章目录 1 unittest 简介1 1 python 单元测试1 2 unittest 测试框架1 3 默认模式1 4 手工模式 2 nose 扩展框架2 1 96 nose 96 的安装和基本用法2 2 96 被测对象 96 的扩展2
  • TLSF 内存分配算法详解

    文章目录 1 DSA 背景介绍1 1 mmheap1 2 mmblk 2 TLSF 原理2 1 存储结构2 2 内存池初始化2 3 free2 4 malloc 参考资料 1 DSA 背景介绍 动态内存管理算法 DSA xff0c Dyna
  • 史上最全采样方法详细解读与代码实现

    项目github地址 xff1a bitcarmanlee easy algorithm interview and practice 欢迎大家star xff0c 留言 xff0c 一起学习进步 1 什么是采样 在信号系统 数字信号处理中
  • Linux Kdump 机制详解

    文章目录 1 简介1 1 安装1 2 触发 kdump1 3 调试 kdump1 3 1 安装 debuginfo vmlinux1 3 2 编译 kernel 1 4 kdump tools service 流程分析 2 原理分析2 1
  • Buildroot 用户手册 (中文)

    文章目录 I Getting started1 About Buildroot2 System requirements2 1 Mandatory packages2 2 Optional packages 3 Getting Buildr
  • 正则表达式 (学习笔记)

    正则表达式的难度不在于难懂 xff0c 而在于对它的表述没有恰当的分类和组织 xff0c 所以弄得很零散难以记忆 按照自己的理解和归纳记录一份笔记 xff0c 以备遗忘时查看 正则表达式 regular expressions 是一种用来匹
  • Linux usb 2. 协议分析

    文章目录 0 背景1 USB 协议传输格式1 1 Packet1 1 1 Token Packet1 1 2 Data Packet1 1 3 Handshake Packet1 1 4 Special Packet 1 2 Transac
  • RISCV 入门 (学习笔记)

    文章目录 1 risv 相关背景1 1 arm 授权费1 2 riscv 发展历史1 3 riscv 风险 2 指令集2 1 可配置的通用寄存器组2 2 规整的指令编码2 3 简洁的存储器访问指令2 4 高效的分支跳转指令2 5 简洁的子程
  • Linux usb 1. 总线简介

    文章目录 1 USB 发展历史1 1 USB 1 0 2 01 2 USB 3 01 3 速度识别1 4 OTG1 5 phy 总线1 6 传输编码方式 2 总线拓扑2 1 Device 内部的逻辑关系2 2 Compound Compos
  • Linux usb 3. Host 详解

    文章目录 1 简介2 Usb Core 驱动设备模型2 1 Usb Device Layer2 1 1 device struct usb device 2 1 2 driver struct usb device driver 2 1 3
  • Linux usb 4. Device 详解

    文章目录 1 简介2 Platform Layer2 1 Platform Device2 2 Platform Driver 3 UDC Gadget Layer3 1 Gadget Bus3 2 Gadget Device3 2 1 E
  • Linux USB (目录)

    1 USB 总线简介 2 USB 协议分析 3 USB Host 详解 4 USB Device 详解 5 usbip USB Over IP 使用实例 6 USB HC UDC 测试 7 Linux 配置 ADBD
  • Linux usb 5. usbip (USB Over IP) 使用实例

    文章目录 0 简介1 Server 配置2 Client 配置参考资料 0 简介 USB Over IP 是一种应用很多的场景 xff0c 目前已经有现成的解决方案 usbip linux 和 windows 环境下都有配套软件 xff0c
  • 最全随机抽样算法(从N个数中抽取M个等)集合

    项目github地址 xff1a bitcarmanlee easy algorithm interview and practice 欢迎大家star xff0c 留言 xff0c 一起学习进步 1 从N个数中等概率抽取M个数 从N个样本
  • Linux usb 6. HC/UDC 测试

    文章目录 1 背景介绍2 Device gadget zero 2 1 96 gadget zero 96 创建2 2 SourceSink Function2 3 Loopback Function 3 Host usbtest ko 3

随机推荐

  • Linux usb 7. Linux 配置 ADBD

    文章目录 1 简介2 ADBD 源码3 Gadget Device 配置3 1 functionfs3 2 legacy 方式配置 functionfs3 3 configfs 方式配置 functionfs3 4 adb 使用配置 参考资
  • HW-RTOS 概述

    文章目录 1 背景介绍1 1 OS 实时难题1 2 Linux 实时补丁1 3 Xenomai 43 Linux 双内核1 4 HW RTOS1 5 More 2 优化点1 xff1a API2 1 原理介绍2 1 1 Software A
  • RISCV MMU 概述

    1 背景简介 Linux 内存管理包含很多内容 xff0c 主要知识点可以参考 Linux Mem 本文只描述其中的一个知识点 Paging and MMU 本文以全志 D1 为例 xff0c 包含了平头哥出品的一颗 Riscv64 的 C
  • 主流 RTOS 评估

    1 RT Thread RT Thread 是国内出产的一款非常优秀的 RTOS 它和 FreeRTOS uCos 等经典 RTOS 最大的不同是 xff1a 它不仅仅是一个实时内核 xff0c 还具备丰富的中间层组件 它提供了一个完整的软
  • Linux mem 2.8 Kfence 详解

    1 原理介绍 Kfence Kernel Electric Fence 是 Linux 内核引入的一种低开销的内存错误检测机制 xff0c 因为是低开销的所以它可以在运行的生产环境中开启 xff0c 同样由于是低开销所以它的功能相比较 KA
  • Linux Phy 驱动解析

    文章目录 1 简介2 phy device2 1 mdio bus2 2 mdio device2 3 mdio driver2 4 poll task2 4 1 自协商配置2 4 2 link 状态读取2 4 3 link 状态通知 3
  • 程序媛工作几年后的感受!体验?

    黑客技术 点击右侧关注 xff0c 了解黑客的世界 xff01 Java开发进阶 点击右侧关注 xff0c 掌握进阶之路 xff01 Python开发 点击右侧关注 xff0c 探讨技术话题 xff01 作者 xff1a hq nuan 来
  • ubuntu 通过 apt-get 安装软件失败时的解决方案

    最近在 vmware上的ubuntu系统下安装 软件时出现安装失败情况 xff0c 在网上搜了一通 xff0c 终于找到了解决方案 遇到的问题和解决方案如下 xff1a 一 apt get install vim二 apt get upda
  • JAVA自学之路 三:要动手

    原创 尚学堂科技 马士兵老师 JAVA自学之路 三 要动手 转载请注明出处 http www bjsxt com zixue zixuezhilu 3 html 无论如何 xff0c 请坚持不懈的动手实验 xff01 学习Java要动手 x
  • Eigen库的安装

    运行命令 xff1a sudo apt get install libeigen3 dev 假设默认安装到 usr local include里 可在终端中输入locate eigen3查看位置 xff0c 若实际中默认安装到了 usr i
  • 搭建自己的简易服务器(公网)

    大部分时候做嵌入式开发的 xff0c 如果是wifi 可以工作在局域网 xff0c 至于物联网设备 xff0c 插手机卡的那种就需要公网ip 测试起来相对比较麻烦 xff0c 电信宽带用户有的可以映射使用 xff0c 但是ip会改变 xff
  • CPP服务器08--http请求响应实现

    http服务设计 对于静态页面服务器来说 xff0c 其工作流程如下 xff1a 接收客户端消息 解析出http请求报文 业务逻辑 xff0c 拼装响应报文 发送给客户端结果 http连接类 设计目标 xff1a 将客户端唯一文件描述符封装
  • Linux C Socket 编程

    以下内容转载自 https www cnblogs com PikapBai p 13964866 html 闪念基因2020 11 20 12 01 20 本文作者 xff1a 她爱喝水 本文链接 xff1a https www cnbl
  • Linux中ROS风格的物理PWM引脚控制,C++代码

    背景 xff1a 拿到一个舵机 xff0c 一个安装了linux和ROS的 小黑盒子 以及一个干干净净啥也不会的脑子 xff0c 然后我从零开始学的 xff0c 总算找到了个能操作舵机的程序 现在只是能跑的状态 xff0c 提供一种思路 x
  • ROS二次开发需要用到的大部分Linux命令

    背景 xff1a 拿到了一架有机载电脑的全部开源的无人机 xff0c 机载电脑安装了ubuntu20 04 xff0c ROS1 xff0c 上面已经在运行了一些程序 我以前只是听过linux xff0c 根本不知道ROS 那么现在需要快速
  • 【技巧】如何为开源社区做贡献

    预计阅读时间 xff1a 6 分钟 Github 这东西怎么用 xff1f 相信有很多人还没有自己操作过 xff0c 这下面给大家推荐一位大佬的文章 xff0c 希望有所帮助 之前有幸参与到一个开源项目中 xff0c 该项目是一个算法知识的
  • MLK | 机器学习采样方法大全

    MLK xff0c 即Machine Learning Knowledge xff0c 本专栏在于对机器学习的重点知识做一次梳理 xff0c 便于日后温习 xff0c 内容主要来自于 百面机器学习 一书 xff0c 结合自己的经验与思考做的
  • python爬虫实战:之爬取京东商城实例教程!(含源代码)

    前言 xff1a 本文主要介绍的是利用python爬取京东商城的方法 xff0c 文中介绍的非常详细 xff0c 下面话不多说了 xff0c 来看看详细的介绍吧 主要工具 scrapyBeautifulSouprequests 分析步骤 1
  • 明面上是个歌手!暗地里是个程序员的明星你只知道许嵩和潘玮柏?

    在5月9日 xff0c 知名演员刘涛在社交平台发文公布 xff1a 已正式入职聚划算成官方优选官了 xff0c 而且还有花名叫刘一刀 xff0c 以后就专职给大家挑好物了 当然 xff0c 刘涛在5 14号已经开始上班了 xff0c 还邀请
  • 如何使用Python实现支付宝在线支付?商家:我人傻了

    windows系统安装Python虚拟环境 首先保证你的系统已经安装好了Python 安装virtualenv C WINDOWS system32 gt pip3 install virtualenv Collecting virtual