一、背景
支付功能是面向C端系统的一个非常典型的功能,而对于很多刚接触支付功能开发者会出现望而止步的现象,大部分的支付平台都需要用企业账号的身份进行签约,导致很多开发者想学习和体验支付功能,受到了一定的阻碍。
既然上有政策,那么必然会出现下有对策的解决办法,只要有问题,就一定会有人解决。
而有一些基于第三方支付平台的服务商模式的签约企业,便为个人开发者提供了支付功能,为广大的普通用户集成支付提供了环境,我们可以用其提供的环境来实现个人账号开通微信支付、支付宝支付,本文带领大家实现一个蓝兔支付平台的个人商户签约。
如今这个时代,有一个属于自己的支付商户号是非常有必要的,因为微信支付和支付宝支付默认不支持个人用户申请的,没有营业执照,那么很多人学习了视频教程中的商城项目、外卖之类的项目就无法做到订单的第二种状态:已支付,无疑是阻断了开发者的技能和学习成长。很多写了苍穹外卖、商城系统、交易类系统的同学无法真正让项目变的真实,那么通过自己申请签约个人支付平台,可以让自己具备对接支付的经验,可以在一定程度上讲自己当前的项目变活,去遇到更多的问题来迫使自己不得不解决。
二、正文开始
2.1、申请前提
(1)、最好有一个自己当前已经备案过的域名,与可访问的网站,签约时需要填写一个备案的域名
(2)、个人银行卡的财产余额至少50元及其以上,需要拿出50元作为签约开通的费用
2.2、蓝兔支付平台介绍
本文教给大家的是蓝图支付,蓝兔支付是支付宝、微信支付官方合作伙伴,可以支持个人、个体户、企业支付接口申请,官方直接签约,无需营业执照,最快10分钟内签约完成,签约后可使用支付宝商户、微信支付商户相关接口能力,资金由支付宝、微信支付官方直连结算。作者在最近的测试过程中发现,蓝兔支付的支付宝支付由于风控的问题,不提供支付宝支付了。
提交申请资料》平台审核》微信官方审核》微信扫码签约》支付开户费用》商户号开通》完成根据API文档接入
官网网址为:www.ltzf.cn
产品介绍如下:
产品支持的范围如下:
2.3、注册蓝兔支付平台
1、打开蓝兔支付的网页,选择快速注册,弹出微信二维码,我们使用手机进行二维码扫描。
2、手机扫码后,成功关注公众号后,会自动注册账号,并提示注册成功,同时PC端会自动跳转到系统的首页面:
3、接下来我们完善下个人的资料,补充完基本资料后,进入到蓝兔支付的首页面:
接下来按照如下流程进行操作:
提交申请资料》平台审核》微信官方审核》微信扫码签约》支付开户费用》商户号开通》完成根据API文档接入
2.4、提交申请资料
1、选择左侧的微信支付菜单中的申请签约选项,在下方的界面中填写自己真实的资料,尤其是网站地址,最好自己有个已经备案的公网域名地址:
按照真实的情况填写数据,最好有个属于自己的公网的备案的域名。
2、然后再第二步的界面中,上传自己的身份正反面的照片,然后输入自己的手机号和邮箱,单击下一步提交:
3、提交成功后,会提示您的签约资料已提交成功,这里我们等待10分钟即可,如下所示:
到此,剩下的流程如下:
平台审核》微信官方审核》微信扫码签约》支付开户费用》商户号开通》完成根据API文档接入
2.5、平台审核
提交完资料后,查看左侧的签约记录菜单,可以看到当前签约记录正在审核:
2.6、微信官方审核
大概10分钟过后,状态会变成官方审核中:
2.7、微信扫码签约
大概几分钟后,官方审核通过,此时状态改变,会提示待商户签约,这里选择签约按钮,弹出二维码进行签约处理,扫码后会提示确认签约商户信息即可。
2.8、支付开户费用
签约确认成功后,状态改变,变成为待支付费用,此时单击支付按钮,显示支付50元的二维码,此时支付即可:
2.9、商户号开通
支付完成,会提示成功,如下所示:
此时选择左侧的商户管理菜单,可以看到自己的商户信息,单击详情可以看到具体信息,如下所示:
2.10、API测试访问
终于到了最后一步,我们此时可以新创建工程,生成PC端的支付二维码完成支付操作即可。
1、首先在官网上选择API文档或者下载中心,下载Demo体验,我这里选择的API文档,没有用官方提供的Demo样例,因为我有一些过往的支付对接的经验,建议大家可以选择下载中的Demo,下载中心的Demo是一个支付的样例工程,用JSP开发了基本的流程,可以研究运行下,改改参数就可以运行。
可以根据下文中的几个测试类,来体验蓝兔支付,本文并没有讲解支付回调。相对于原生的第三方平台的微信支付和支付宝支付的开发难度,蓝兔支付平台的代码开发相对来说较为简单。
地址在这里:蓝兔支付文档
2、本文不会开发出完整的支付流程,只验证当前是否可以成功创建支付请求,是否可以成功返回下单的URL即可。
创建一个maven项目,并导入如下依赖:
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.16.0</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.18</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.28</version>
</dependency>
</dependencies>
3、创建加密签名类:
public class PaySignUtil {
/**
* 支付参数签名
*
* @param params 需要参与签名的参数
* @param partnerKey 商户密钥
* @return {String} 参数签名
*/
public static String createSign(Map<String, Object> params, String partnerKey) {
// 生成签名前先去除sign
params.remove("sign");
String stringA = packageSign(params, false);
String stringSignTemp = stringA + "&key=" + partnerKey;
return SecureUtil.md5(stringSignTemp).toUpperCase();
}
/**
* 组装签名的字段
*
* @param params 参数
* @param urlEncoder 是否urlEncoder
* @return {String}
*/
public static String packageSign(Map<String, Object> params, boolean urlEncoder) {
// 先将参数以其参数名的字典序升序进行排序
TreeMap<String, Object> sortedParams = new TreeMap<String, Object>(params);
// 遍历排序后的字典,将所有参数按"key=value"格式拼接在一起
StringBuilder sb = new StringBuilder();
boolean first = true;
for (Entry<String, Object> param : sortedParams.entrySet()) {
String value = String.valueOf(param.getValue());
if (StrUtil.isBlank(value)) {
continue;
}
if (first) {
first = false;
} else {
sb.append("&");
}
sb.append(param.getKey()).append("=");
if (urlEncoder) {
try {
value = urlEncode(value);
} catch (UnsupportedEncodingException e) {
}
}
sb.append(value);
}
return sb.toString();
}
public static String urlEncode(String src) throws UnsupportedEncodingException {
return URLEncoder.encode(src, "utf-8");
}
}
4、定义测试生成PC端二维码的支付类:
public class LantuPayUtil {
public static final String mchId = "自己的商户号";
public static final String notifyUrl = "支付回调地址";
public static final String key = "自己的商户秘钥";
public static void main(String[] args){
//商户订单号,只能是数字、大小写字母_-且在同一个商户号下唯一。
String out_trade_no = "2023" + System.currentTimeMillis();
String total_fee = "0.01"; //支付金额
//商品描述
String body = "商品描述参数";
Long stime = System.currentTimeMillis()/1000;
//当前时间戳
String timestamp = String.valueOf(stime);
Map<String, Object> map = new HashMap<>();
map.put("mch_id", mchId);
map.put("out_trade_no", out_trade_no);
map.put("total_fee", total_fee);
map.put("body", body);
map.put("notify_url", notifyUrl);
map.put("timestamp", timestamp);
String sign = PaySignUtil.createSign(map, key);
map.put("sign", sign);
//微信扫码支付接口地址
String url = "https://api.ltzf.cn/api/wxpay/native";
String result = HttpRequest.post(url).form(map).execute().body();
System.out.println(result);
String msg = "";
if (StrUtil.isBlank(result)) {
msg = "API接口返回为空,请联系客服";
}else{
try{
JSONObject jsonObject = (JSONObject) JSONObject.parse(result);
Integer code = jsonObject.getInteger("code");
if(code==0){
String qrcode = jsonObject.getJSONObject("data").getString("QRcode_url");
msg = "请使用微信扫码下方二维码:" + qrcode;
}else{
String msgstr = jsonObject.getString("msg");
msg = "返回失败:" + msgstr;
}
} catch (JSONException e) {
msg = e.getMessage();
} catch (Exception e) {
msg = e.getMessage();
}
}
System.out.println(msg);
}
}
将程序中的3个常量换成自己商户信息即可,接口调用成功后,控制台会返回二维码的路径:
我们在浏览器中,打开这个URL,进行扫码支付,支付成功后,可以在蓝兔的后台看到支付的账单结果:
至此,我们作为个人签约蓝兔支付平台,可以成功的对接了支付API,以后我们就可以开发出支付功能的系统了,瞬间变的高大上了。
三、总结
今天分享了,如何申请个人签约类型的支付平台商户信息,如果自己想要学习支付功能,不如马上去动手实践吧,蓝兔平台的签约过程时间非常快,工作时间不到30分钟就审核完成了。我同时发现蓝兔官方并没有单独封装Java SDK,只是提供了HTTP请求的样例代码,而这种没有的东西,正式我个人最近计划要做的内容和目标,我计划最近做一个开源的蓝兔支付的Java SDK,方便大家使用,毕竟目前很多人都因为没有支付信息,让自己停留在了学习阶段。除了蓝兔支付,市场上还有个支持个人签约的YunGouOS,他们家的支付SDK建设的比蓝兔支付的全且完整一点。
同时本文也是作者的个人知识星球【觉醒的新世界程序员】中最近正在分享的开源设计系列专题中的其中一篇文章,如果想了解相关内容,可以来了解下。目前计划根据某个开源的SDK工具包为例子,来学习它的设计思路和代码封装结构,希望可以帮助大家学会和掌握SDK的设计和最佳实践等,目前计划分享的这个SDK是微信支付工具包wxjava,这个项目对于微信下的API对接封装的非常不错,非常值得大家学习,比如微信公众号、微信小程序、微信支付等等,都可以十分方便集成到项目中,在2021年的时候,由于工作关系,发现其里面有个逻辑不支持正向代理,于是在拉取源码后,增加了适配逻辑,并进行了PR,成功在公司项目中用到了自己贡献的代码。
近期的分享将会在最后仿照他设计一个支付SDK的工具包,作为目标产出。对于日常业务功能的开发,多少会遇到HTTP的三方接口调用的例子,那么学习这个可以让自己设计出更佳优雅的SDK,以便加强自己。
如果本文对你有用,可以去实践哦,蓝兔网站的直达链接单击这里。
如果本篇文章对你有用,收藏、关注、分享、点赞哦。
如果你想一起参与蓝兔支付Java SDK开源项目的建设,可以关注我的Github吧,最近将会写一个针对蓝兔支付的SDK。目前Github的仓库地址如下:
感兴趣的可以和我一起来设计封装下蓝兔支付的SDK。