很早之前,起步时就想用易语言来对接易支付,不过却一直没有思路,实属恼火
后面多方请教,耐不过没有基础只得先填上底子
开发文档
易支付的开发文档里给了:页面跳转(前端)和API接口(后端)两种调用模式
但在这里我只讲“API接口”部分
准备请求参数
阅读开发文档可知,需准备如下参数
- 商户ID (pid)
- 支付方式 (type)
- 商户订单号 (out_trade_no)
- 异步通知地址 (notify_url)
- 商品名称 (name)
- 商品金额 (money)
- 用户IP地址 (clientip)
- 签名(sign)
- 签名类型(sign_type)
其中,异步通知地址、用户ip地址 皆为占位符参数
构建请求参数
除out_trade_no和sign外的参数就不必多说,重点说这两个
订单号
分析开发文档中的订单号参数的示例值:20160806151343349
我们可以将其视为一个时间戳,其表示为:2016年8月6日15时13分43秒349毫秒
嗯?没错,我们可以尝试去用现在的时间所转化后的时间戳来作为这个参数的值
打开易语言,新建一个windows窗口程序
定义相关程序集变量(site,文本型,易支付站点|id,文本型,易支付商户id|key,文本型,易支付商户密钥)
Ctrl+n,两个新子程序
1.获取订单号,文本型;Ctrl+l创建两个子程序变量:文本1、文本2(文本型)
2.易支付_发起支付,字节集,enter创建6个参数:
推荐设置全局变量,因为查单的时候会快捷些
支付方式无非就是3个判断,当为1时,支付方式为微信....需单独创建子程序变量
我们知道,在易语言中获取当前时间可以用命令:取现行时间 (),其返回的是日期时间型的值
现在我们将其转成文本:到文本(取现行时间()),它就回返回当前时间,例如:2024年8月25日14时54分23秒
再接着,我们使用子文本替换命令,将其当前时间文本中的“年、月、日...”等时间字段去掉
我们就可以得到当前时间的时间戳了,但为防止一时间并发数过多导致订单号重复,我们就需要在这时间戳(14位)后再加入三位或不等的数
Sign
根据开发文档,我们知道其需要用到md5加密sign签名参数,+商户密钥
而签名参数则需按照参数名ASCII码从小到大排序(a-z)
sign、sign_type或空值不参与进签名参数
ASCII码从小到大排序,例如[
原参数:person=Wang&job=worker&saying=helloworld
排序后:job=worker&person=Wang&saying=helloworld
具体参数构建过程就不必多说,直接看下图即可
发起请求-GET
发起请求,请求方式我选择的是GET,当然POST也行
可以用精益模块的网页_访问对象命令来发起请求
发起请求后我们需要获取其响应内容(返回内容)
阅读开发文档可知,其返回的是json
那么我们就需要去解析这个json,并提取出我们所要的field的值
我在写的时候是简化了的,并没有去判断code,直接获取qrcode,但这并不绝对,你需要多方面考量,这里我提供下我的思路
解析其keyword,我设立三种情况,并在获取到后再次发送get请求至草料二维码的文本二维码生成接口,这将返回一个url
这里获取其field我并没有直接使用模块,而是用的正则表达式
两个参数:content(内容),keyword(关键字符=>field)
如果没有取出则返回no
接着我再用了一个正则表达式去提取出GET请求(草料二维码接口返回url)所返回的文本中的二维码图片
最后使用http读文件命令,获取到其二维码字节集,最后返回其字节集
查询支付状态
同样先创建一个子程序,查询支付状态,逻辑型
四个参数(在前面若你已设定了全局变量则可直接跳过):站点,id,密钥,订单号(皆文本型)
然后构建参数,act默认为order
然后就搞定了