python tornado 支付宝小程序,简单接入支付宝支付,支付宝小程序开发前准备(前后端分离)

前言
小弟才毕业不久也是第一次写博客写请各位老哥多担待,之前只是了解一点微信小程序 支付宝的小程序更是没有接触过 最近公司有项目需要弄一个支付宝的小程序 ,期间在调用支付宝接口还有开发前的准备配置也是一直在摸索 因为不知道所以做起来就小心翼翼 我也整理了一些开发中遇到的问题 希望对跟我一样的新手会有帮助。

话不多说开始准备第一步:
开发支付宝小程序 先进入支付宝开放平台 https://openhome.alipay.com/ 点击登录python tornado 支付宝小程序,简单接入支付宝支付,支付宝小程序开发前准备(前后端分离)_第1张图片
 这时候就需要注意了, 支付宝的支付接口不提供给个人,所以咱们自己的支付宝账号是无法接入支付的,只有企业账号才可以申请支付接口。下图为查看账号信息。我们先看一下个人版本的(个人无法支付)。
查看账号信息
个人账号
python tornado 支付宝小程序,简单接入支付宝支付,支付宝小程序开发前准备(前后端分离)_第2张图片
进入开发者中心选择小程序
python tornado 支付宝小程序,简单接入支付宝支付,支付宝小程序开发前准备(前后端分离)_第3张图片
点击创建小程序
python tornado 支付宝小程序,简单接入支付宝支付,支付宝小程序开发前准备(前后端分离)_第4张图片

创建之后点击查看
在这里插入图片描述点击查看进入小程序详细页面 滑动到底部 点击添加功能
python tornado 支付宝小程序,简单接入支付宝支付,支付宝小程序开发前准备(前后端分离)_第5张图片

功能列表中的功能就是支付宝提供的SDK包每一个功能就是一个SDK包下图为个人账号注册小程序后支付宝提供的SDK 很遗憾没有看见支付功能。

python tornado 支付宝小程序,简单接入支付宝支付,支付宝小程序开发前准备(前后端分离)_第6张图片下面展示当登录的账号是企业类型的账号 会有什么不同呢?

此图为使用企业账号登录所创建的小程序,我们可以看到使用企业账号注册后的小程序支付宝给我们提供了很多功能一页都放不下=。=。请注意:下文所有的操作,截图,都是基于企业版本所创建的小程序 创建小程序的流程都是一样的。申请企业账号就不说啦我没申请过。
python tornado 支付宝小程序,简单接入支付宝支付,支付宝小程序开发前准备(前后端分离)_第7张图片重点来了 那我们需要添加那几个功能可以让我们的小程序完成支付呢 ?请看下图

python tornado 支付宝小程序,简单接入支付宝支付,支付宝小程序开发前准备(前后端分离)_第8张图片
没有错 显而易见我们需要添加的功能是小程序支付,在添加一个获取会员基础信息,(jsAPI好像是创建完后直接自带的),我们可以注意到上图有一列显示是否需要签约,当我们添加小程序支付功能后,需要进行签约才可以使用此功能提供给我们的SDK包可以查看官方说明文档。下图为官方文档的截图
python tornado 支付宝小程序,简单接入支付宝支付,支付宝小程序开发前准备(前后端分离)_第9张图片
叨叨碎:签约也是需要资质的上传营业执照什么的跟负责人说让他们给你资质申请就好了。
诶呀 假如这些准备工作都结束了 咱们就可以一起看看整体的支付流程还有后端需要调用那些接口了点击查看官方文档向下滑!!滑到图。嘿嘿你要是不想看那就继续看我的解读,献丑了啊。上图先
python tornado 支付宝小程序,简单接入支付宝支付,支付宝小程序开发前准备(前后端分离)_第10张图片我先说一下大体的流程有的接口不知道也没关系后面会细说。

支付11步

  1. 首先,比如用户进入到了你的小程序选中了这个商品开始下单了。
  2. 这时候你的前端一看有人下单了,好好好,然后带着信息就去告诉后端(商户服务器)哥有人要买货,这是他的信息 (会带一个user_id支付宝中用户的唯一标识,获取方式是通过用户授权后面再说)。
  3. 后端(商户服务端)会带着前端提交的的数据 在自己加点别的数据(比如自己生成的订单号了,价格了一堆,支付后的回调url)去在访问 支付宝的服务端 调用人家接口肯定得去人家服务器啊。
  4. 支付宝的服务端 看到了我们的后端 带着一堆数据来了 然后检查检查 发现合理 合情合法可以交易一波,然后返回一个tradeNo支付宝服务器生成订单号)给我们(商户服务器)。
  5. 我们得到了tradeNO以后 就是为了把这个信息告诉给前端 所以我们把这个 tradeno支付宝服务器生成的订单号)给传给前端
  6. 这时候前端 已经等的饥渴难耐了,得到了后端的tradeno 前端调用my.tradepay 页面上就唤醒了支付宝的收银台 。
  7. 然后前端把数据直接传给支付宝的服务端 这时候前端已经抛弃了咱们后端,跟支付宝后端眉来眼去的
  8. 支付宝后端(服务端)处理完了给前端一个结果成功或失败
  9. 支付宝后端 给前端结果的时候也告诉了咱们后端(商户服务端)
  10. 这步骤其实就是一个回调第3步的时候后端给支付宝的参数有个回调url然这时候派上用场了 处理支付结果就是在这个回调路由里写的,这个回调的功能就可以如果回调成功了 你就可以把数据存库里了,其实不写也没事看自己需求,不影响支付。
  11. 都完事了返回个信息return 一下 就在回调的那个路由下面返回。注意:成功返success 返回别的可能会莫名其妙的多出来好几个不存在的订单号。

这就是完整的支付11步骤 刚才回头看了一遍好像就是重复了一遍图里的逻辑哈哈哈哈,在本文中我只说后端啦~,很显然后端只需要做其中的3,5,10,11。而且你要只想完成支付的实现你都不需要10,11我的天啊=。=下流!。对了那些唤醒收银台炫酷的画面都是前端老哥调用的后端就只需要传正确的数据就行把正确的tradeno给前端就成了。
python tornado 支付宝小程序,简单接入支付宝支付,支付宝小程序开发前准备(前后端分离)_第11张图片
支付的流程大体看完了吧 咱们该去下载SDK了点我去下载找到PYTHON的SDK点开适用于 Python 2.7 及以上版本的开发环境!你的版本 >2.7就OK。复制命令去安装

python tornado 支付宝小程序,简单接入支付宝支付,支付宝小程序开发前准备(前后端分离)_第12张图片如果这些已经准备完成了咱们就可以先行进行开发了~~
下面的代码配置alipayclient 来调用具体的api

#导入支付宝sdk 当你的包已经安装成功后 
from alipay.aop.api.AlipayClientConfig import AlipayClientConfig
from alipay.aop.api.DefaultAlipayClient import DefaultAlipayClient
from alipay.aop.api.constant.ParamConstants import *
from alipay.aop.api.domain.AlipayEbppInvoiceTitleListGetModel import AlipayEbppInvoiceTitleListGetModel
from alipay.aop.api.request.AlipayEbppInvoiceTitleListGetRequest import AlipayEbppInvoiceTitleListGetRequest
from alipay.aop.api.response.AlipayEbppInvoiceTitleListGetResponse import AlipayEbppInvoiceTitleListGetResponse
from alipay.aop.api.domain.AlipayTradeCreateModel import AlipayTradeCreateModel
from alipay.aop.api.request.AlipayTradeCreateRequest import AlipayTradeCreateRequest
from alipay.aop.api.response.AlipayTradeCreateResponse import AlipayTradeCreateResponse
from alipay.aop.api.request.AlipaySystemOauthTokenRequest import AlipaySystemOauthTokenRequest
#关闭订单的
from alipay.aop.api.request.AlipayTradeCloseRequest import AlipayTradeCloseRequest

#实例化支付宝客户机配置
alipay_client_config = AlipayClientConfig()
#支付宝 固定网关
alipay_client_config.server_url = 'https://openapi.alipay.com/gateway.do'
#小程序id
alipay_client_config.app_id = '你的小程序id'
#小程序私钥
alipay_client_config.app_private_key = "自己生成"
#支付宝公钥
alipay_client_config.alipay_public_key ="自己生成"
#编码格式
alipay_client_config.charset ="UTF-8"
#签名类型(报文请求会自动签名) 支付宝不需要用户自己生成签名会直接给你生成的
alipay_client_config.sign_type="RSA2"
#使用alipayclient 来调用具体的api 
alipayClient = DefaultAlipayClient(alipay_client_config)

包导的有点多哈,可以选择需要自己要用的包导入,简单的说上面的代码是为了配置alipayClient,接下来访问调用接口我们只需要使用alipayClient去访问支付宝接口就行(这句我也不知道怎么具体表达),建议把这些配置成公用部分省的用一次配一次。注意:小程序私钥,支付宝公钥,支付宝的开发文档是不建议写在代码内部的。

小程序私钥跟支付宝公钥点如何生成点击查看官方文档。生成密钥还是比较简单的支付宝官方还提供了教学视频,python就选择红框圈中的选项即可。生成密钥的工具也是在官方文档中可以找到下载的-----工具下载地址。python tornado 支付宝小程序,简单接入支付宝支付,支付宝小程序开发前准备(前后端分离)_第13张图片
当你已经获得了密钥以后咱们先留好应用私钥(小程序私钥),拿着应用公钥(小程序公钥)去跟支付宝去换一个支付宝公钥。我们回到小程序信息页面点击最下面的设置
python tornado 支付宝小程序,简单接入支付宝支付,支付宝小程序开发前准备(前后端分离)_第14张图片

点击设置(需要支付宝支付密码或者绑定的手机先验证后才可以设置)
python tornado 支付宝小程序,简单接入支付宝支付,支付宝小程序开发前准备(前后端分离)_第15张图片我的已经设置好了过程就不展示了给你们粘一组官网图片图片地址
python tornado 支付宝小程序,简单接入支付宝支付,支付宝小程序开发前准备(前后端分离)_第16张图片

终于获得了支付宝公钥,咱们终于可以去开心的写代码了,东西已经全了够用了。

大体就是 咱们自己通过支付宝的工具生成应用公钥应用私钥,拿着自己的公钥去换支付宝的公钥,然后在开发过程中使用自己的私钥和支付宝的公钥。就是这样想了解这个机制请看从支付宝SDK的支付流程理解什么是公钥和私钥很详细。

之前咱们引入了**获取会员基础信息模块** 这个跟支付有什么关系??小程序支付时候会需要**user_id**而user_id的获取就离不开这个模块。

获取user_id

注意哦这个code是前端 调用my.getAuthCode获得后传给你的

#主要是获取user_id
#获取支付宝授权(换取授权 接alipay.system.oauth.token接口)
class ZfbEmpowerHandler(tornado.web.RequestHandler):
    # 服务器端 跨域请求加上请求头
    def set_default_headers(self):
        self.set_header("Access-Control-Allow-Origin", "*")  # 这个地方可以写域名
        self.set_header("Access-Control-Allow-Headers", "x-requested-with")
        self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
        
    def post(self):
	#code 这是前端传过来的
        code = self.get_argument('code',None)
        #创建请求alipay.system.oauth.token(换取授权访问令牌)
        request =AlipaySystemOauthTokenRequest()
        #添加参数
        request.grant_type = "authorization_code"
        #添加code (前端传过来的) 换成code
        request.code = code
        #!!!!!此时的alipayclient 是已经配置好参数的 最开始的代码有配置不配置没有用!!
        response = alipayClient.execute(request)
        #返回的数据是 response 是字符串 转换成字典 授权成功存入cookie
        if "user_id" in eval(response):
            user_id = eval(response)["user_id"]
           
            #response 获得的数据
            '''
            {"access_token":"authbseB30318998c927694dsawqw0",
            "alipay_user_id":"20880030608012624769891611580",
            "expires_in":31536000,"re_expires_in":31536000,
            "refresh_token":"authbseBb9c70696e1d4459ea9e99d992c438E80"
            ,"user_id":"20888021231421421"}
            '''
            return self.write({"user_id":user_id,"err_msg":"ok"})
        else:
            #msg 返回支付宝提示
            return self.write({"err_msg":eval(response)["sub_msg"]})

如果对上面代码的参数不理解可以参考官方文档

如果你的user_id获取很成功那么就来进行生成订单吧就是生成trade_no

生成trade_no Handler(3,5)步

#生成订单trade_no
class CreateOrderHandler(tornado.web.RequestHandler):
    # 服务器端 跨域请求加上请求头
    def set_default_headers(self):
        self.set_header("Access-Control-Allow-Origin", "*")  # 这个地方可以写域名
        self.set_header("Access-Control-Allow-Headers", "x-requested-with")
        self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')
        
    def get(self):
       #可以让前端传给你user_id也可以存在redis中自己获取随意
        user_id = self.get_argument('user_id',None)
        #生成商户订单号(后台自己生成不重复随机)
        out_trade_no = str(int(time.time() * 1000)) + str(random.randint(100000, 999999))
        #商品价格(根据需求自定义)
        total_amount = 9.9
        #订单标题 (根据需求自定义)
        subject = "标题"
        #用户支付宝uid
        buyer_id = user_id

        data ={"user_id":user_id,"out_trade_no":out_trade_no,"subject":subject,"buyer_id":buyer_id,"total_amount":total_amount}
        request = AlipayTradeCreateRequest()
        request.biz_content =data
        request.notify_url ="https://www.你的域名.com/回调url"
        response = alipayClient.execute(request)
        #数据正确 下单成功返回
        if "trade_no" in eval(response):
            trade_no = eval(response)["trade_no"]
            
            #返回给前端trade_no
            return self.write({"trade_no":trade_no})
        #失败返回
        else:
            pass
    

参数的详细说明请看官方文档。

    如果成功生成了trade_no后端就OK了。之前不是说了吗后端在支付流程只需要完成3,5,10,11。现在已经完成了3(获得trade_no),5(发送前端trade_no)。注意在CreateOrderHandler中就已经完成了3和5,ZfbEmpowerHandler的目的是获取user_id属于生成trade_no的准备工作。

回调Handel(10,11)步

注意几个问题,首先就是在回调路由中ZfbNotifyHandler 你自己设置的cookie是无效的因为你现在得到的结果是支付宝服务器对你进行访问的,里面不可能有你自己设置的cookie。详解请看–文章支付宝异步通知返回时cookie、session为什么会失效?,还有就是成功需要返回success!!!

#支付成功回调路由(存储信息到库)(支付宝回调 前端cookie无效 )
class ZfbNotifyHandler(tornado.web.RequestHandler):
    # 服务器端 跨域请求加上请求头
    def set_default_headers(self):
        self.set_header("Access-Control-Allow-Origin", "*")  # 这个地方可以写域名
        self.set_header("Access-Control-Allow-Headers", "x-requested-with")
        self.set_header('Access-Control-Allow-Methods', 'POST, GET, OPTIONS')

    def post(self):
        #接受回调信息
        request =self.request.arguments
        value = request
        #取出订单状态
        trade_status = value["trade_status"][0].decode('utf8')
        #如果 返回的状态 成功
        if trade_status == "TRADE_SUCCESS":
            #取出订单号 用户user_id 商户订单号 支付时间
            trade_no = value["trade_no"][0].decode('utf8')
            user_id = value["buyer_id"][0].decode('utf8')
            out_trade_no = value["out_trade_no"][0].decode('utf8')
            notify_time = value["notify_time"][0].decode('utf8')
           '''
           可以把订单信息存入数据库看自己业务需求
           '''
           #注意成功请返回 success 不然支付宝可能会一直回调此路由
           return self.write("SUCCESS")
        else:
            pass
               

在这里10,11也已经完成了。正常的支付流程就已经结束了。

这就是我在开发过程中的理解和整理,本文过于繁琐,因为刚开发不久很多东西没有用过,用的过程中也有很多困惑,所以这些繁琐的说明就是当时我在开发时候遇到的疑惑,希望能对也没有接触过支付宝小程序的你有一定的帮助吧,但是你要是开发大哥你要看了还笑话我那也忒不地道了o( ̄▽ ̄)ブ。第一次写文章有不好的请多指教多包涵,感谢文中所有链接的文章给予我的帮助,没有前辈的文章解惑也不会让我更快的理解一些问题。

你可能感兴趣的:(python tornado 支付宝小程序,简单接入支付宝支付,支付宝小程序开发前准备(前后端分离))