前言
小弟才毕业不久也是第一次写博客写请各位老哥多担待,之前只是了解一点微信小程序 支付宝的小程序更是没有接触过 最近公司有项目需要弄一个支付宝的小程序 ,期间在调用支付宝接口还有开发前的准备配置也是一直在摸索 因为不知道所以做起来就小心翼翼 我也整理了一些开发中遇到的问题 希望对跟我一样的新手会有帮助。
话不多说开始准备第一步:
开发支付宝小程序 先进入支付宝开放平台 https://openhome.alipay.com/ 点击登录
这时候就需要注意了, 支付宝的支付接口不提供给个人,所以咱们自己的支付宝账号是无法接入支付的,只有企业账号才可以申请支付接口。下图为查看账号信息。我们先看一下个人版本的(个人无法支付)。
个人账号
进入开发者中心选择小程序
点击创建小程序
创建之后点击查看
点击查看进入小程序详细页面 滑动到底部 点击添加功能
功能列表中的功能就是支付宝提供的SDK包每一个功能就是一个SDK包下图为个人账号注册小程序后支付宝提供的SDK 很遗憾没有看见支付功能。
此图为使用企业账号登录所创建的小程序,我们可以看到使用企业账号注册后的小程序支付宝给我们提供了很多功能一页都放不下=。=。请注意:下文所有的操作,截图,都是基于企业版本所创建的小程序 创建小程序的流程都是一样的。申请企业账号就不说啦我没申请过。
重点来了 那我们需要添加那几个功能可以让我们的小程序完成支付呢 ?请看下图
没有错 显而易见我们需要添加的功能是小程序支付,在添加一个获取会员基础信息,(jsAPI好像是创建完后直接自带的),我们可以注意到上图有一列显示是否需要签约,当我们添加小程序支付功能后,需要进行签约才可以使用此功能提供给我们的SDK包可以查看官方说明文档。下图为官方文档的截图
叨叨碎:签约也是需要资质的上传营业执照什么的跟负责人说让他们给你资质申请就好了。
诶呀 假如这些准备工作都结束了 咱们就可以一起看看整体的支付流程还有后端需要调用那些接口了点击查看官方文档向下滑!!滑到图。嘿嘿你要是不想看那就继续看我的解读,献丑了啊。上图先
我先说一下大体的流程有的接口不知道也没关系后面会细说。
这就是完整的支付11步骤 刚才回头看了一遍好像就是重复了一遍图里的逻辑哈哈哈哈,在本文中我只说后端啦~,很显然后端只需要做其中的3,5,10,11。而且你要只想完成支付的实现你都不需要10,11我的天啊=。=下流!。对了那些唤醒收银台炫酷的画面都是前端老哥调用的。后端就只需要传正确的数据就行把正确的tradeno给前端就成了。
支付的流程大体看完了吧 咱们该去下载SDK了点我去下载找到PYTHON的SDK点开适用于 Python 2.7 及以上版本的开发环境!你的版本 >2.7就OK。复制命令去安装
如果这些已经准备完成了咱们就可以先行进行开发了~~
下面的代码配置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就选择红框圈中的选项即可。生成密钥的工具也是在官方文档中可以找到下载的-----工具下载地址。
当你已经获得了密钥以后咱们先留好应用私钥(小程序私钥),拿着应用公钥(小程序公钥)去跟支付宝去换一个支付宝公钥。我们回到小程序信息页面点击最下面的设置。
点击设置(需要支付宝支付密码或者绑定的手机先验证后才可以设置)
我的已经设置好了过程就不展示了给你们粘一组官网图片图片地址
终于获得了支付宝公钥,咱们终于可以去开心的写代码了,东西已经全了够用了。
大体就是 咱们自己通过支付宝的工具生成应用公钥应用私钥,拿着自己的公钥去换支付宝的公钥,然后在开发过程中使用自己的私钥和支付宝的公钥。就是这样想了解这个机制请看从支付宝SDK的支付流程理解什么是公钥和私钥很详细。
之前咱们引入了**获取会员基础信息模块** 这个跟支付有什么关系??小程序支付时候会需要**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
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的准备工作。
注意几个问题,首先就是在回调路由中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( ̄▽ ̄)ブ。第一次写文章有不好的请多指教多包涵,感谢文中所有链接的文章给予我的帮助,没有前辈的文章解惑也不会让我更快的理解一些问题。