对于需要接入支付功能的app或者博客、资源站来说,申请一个支付通道,过于麻烦,每年还需要申报公司税务等等
如果只是个人搭建的博客站,或者资源站、线下收费等小额场景,可以使用免签服务。
申请账号获取参数
市面上许多的发卡平台,如 zfaka、风铃发卡、独角数卡等,都支持使用易支付。易支付接口绝大多数平台都兼容支持
如果自己搭建发卡平台,或者自建公众号等资源站,只需要前往平台注册账号即可,
注册完成后,都会提供一个 appId
以及 key
, 这两个参数各家平台命名不一样,可能叫 pid
或者 key
但本质都是一个东西。
如果有技术能力,可以自行搭建开源的 V免签
服务器接入
对于拥有博客服务器的来说,接入主要实现两个接口:
- 一个是创建订单。用于生成订单请求。
- 二是通知接口,用于支付成功后,后续处理
客户端接入
如果是个人开发者的 app,没有服务器,或者使用的是 autojs 等脚本文件,单独去购买服务器,搭建、运维等,成本高,也不一定有能力完成。有第二个方案,同样需要实现两个接口 :
- 一个是创建订单。用于生成订单请求。
- 二是轮询查询订单,看是否完成订单支付
第二种方式相对第一种安全性降低。由于没有自己的服务器参与,可能存在客户端被破解、被篡改等问题。推荐第一种服务器接入
创建订单接口
接口:/createOrder
创建订单需要提供参数,以及签名,防止数据篡改,
参数 | 参数类型 | 参数说明 |
---|---|---|
appId | 字符串 | 【必传】商户唯一识别号 |
payId | 字符串 | 【必传】商户订单号,可以是时间戳,不可重复 |
type | 整数 | 【必传】微信支付传入1 支付宝支付传入2 |
price | 小数 | 【必传】订单金额 |
sign | 字符串 | 【必传】签名,计算方式为 md5(payId+param+type+price+通讯密钥) |
param | 字符串 | 【可选】传输参数,将会原样返回到异步和同步通知接口 |
notifyUrl | 字符串 | 【可选】传输参数,支付成功后的同步通知接口 |
returnUrl | 字符串 | 【可选】传输参数,支付成功后的同步通知接口 |
isHtml | 整数 | 【可选】传入1则自动跳转到支付页面,否则返回创建结果的json数据 |
如果没有服务器,纯客户端创建订单, isHtml
传入 0
,然后获取 json
数据,再保存其中的 .data
节点下的 orderId
,通过 orderId
轮询,判断订单是否完成
获取完成通知
服务器接入方式:在生成订单的时候,需要填入 notifyUrl
, 当订单完成时,会发送通知到这个链接中,通知参数如下:
payId | 字符串 | 商户订单号 |
---|---|---|
param | 字符串 | 创建订单的时候传入的参数 |
type | 整数 | 支付方式 :微信支付为1 支付宝支付为2 |
price | 小数 | 订单金额 |
reallyPrice | 小数 | 实际支付金额 |
sign | 字符串 | 校验签名,计算方式 = md5(payId + param + type + price + reallyPrice + 通讯密钥) |
一般传入了 notifyUrl
链接的,意味着是服务端创建订单并搭建。所以必须校验 sign
签名确保安全。
轮询订单判断是否完成
以前面提到的为例,如果是以 客户端接入 的方式,没有服务器的 notifyUrl
参数。那么可以通过查询接口,查看之前创建的订单是否完成,涉及到的参数只有一个:orderId
,这个 orderId
就是之前创建订单时,返回的一个参数
查询方式:/getOrder
返回参数 | 参数类型 | 参数说明 | ||
---|---|---|---|---|
code | 整数 | 返回代码(1:成功,-1:调用失败) | ||
msg | 字符串 | api调用结果说明 | ||
data | 数组 | api调用结果(如果code为-1,则data为null) | ||
返回参数 | 参数类型 | 参数说明 | ||
payId | 字符串 | 商户订单号 | ||
orderId | 字符串 | 云端订单号,可用于查询订单是否支付成功 | ||
payType | 整数 | 微信支付为1 支付宝支付为2 | ||
price | 小数 | 订单金额 | ||
reallyPrice | 小数 | 实际需付金额 | ||
payUrl | 字符串 | 支付二维码内容 | ||
isAuto | 整数 | 1需要手动输入金额 0扫码后自动输入金额 | ||
state | 整数 | 订单状态:-1 订单过期 0 等待支付 1 完成 2 支付完成但通知失败 | ||
timeOut | 整数 | 订单有效时间(分钟) | ||
date | 长整数 | 订单创建时间时间戳(13位) | ||
每个支付平台参数都不一样,仅供参考。通过返回字段的 data
中的 state
可以得知,订单是否已经完成。由于是客户端接入,通知服务必定失败。所以,当订单状态为 1
或者订单状态为 2
时,可以视为订单完成。
通过客户端接入,可以 0 成本的接入收款系统,但也正是由于客户端接入,生成订单的 pid 已经 key 都是需要保存在客户端代码中,所以风险也很高,需要自行评估这种接入方式的 破解、篡改成本。
最近使用了 AutoJs 编写了很多脚本文件,对于 AutoJs 来说,可以使用客户端接入方式,直接生成订单。不需要额外成本。但是脚本文件一定要使用 js 加密工具处理