支付项目成果视频
效果很简单:
- 用户输入手机号登录。
- 登录成功,也注册成功,然后请求支付二维码。
- 用户扫码付款,然后后端接收支付回调,更改用户已支付。
- 用户点击按钮刷新页面,发现已支付,查看商品文章。
本文章以 XorPay的native支付 作为案例讲解, 如果你需要对接别的支付,也可以联系我!!!
申请XorPay
保管好你的aid 和 app secret 这是支付接口的凭证
创建用户表:
CREATE TABLE `t_user` ( `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', `phone` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '手机号', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `idx_phone` (`phone`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
以用户手机号注册,登录。作为支付的用户凭证。
登录,注册同一个接口:
@PostMapping("/user/login")
@ResponseBody
public Result login(@RequestBody User user) {
if (!StringUtils.hasLength(user.getPhone())) {
return Result.err("手机号不能为空!");
}
User u = new User();
u.setPhone(user.getPhone());
List users = userMapper.select(u);
if (CollectionUtils.isEmpty(users)) {
// 注册
user.setCreateTime(new Date());
user.setId(null);
userMapper.insert(user);
}
return Result.ok(user.getPhone());
}
登录,注册成功后,将手机号存储到用户网页端的 localStorage 。下次直接走支付请求。前端代码我就不贴了。
获取支付二维码通过上面登录,注册 你已经获取了用户phone ,接下来就是获取支付二维码:
Mapmap = new HashMap (); // 商品名称 map.put("name", post.getName()); // 支付类型 固定native map.put("pay_type", post.getPayType()); //价格 map.put("price", post.getPrice()); // 订单id,保证每次唯一就行 map.put("order_id", post.getOrderId()); // 用户id, 手机号 map.put("order_uid", post.getOrderUid()); // 支付成功回调 map.put("notify_url", post.getNotifyUrl()); // 签名 map.put("sign", post.getSign()); // 附加信息, 成功回调会透传 map.put("more", more); String result = null; // 请求 native支付 二维码 result = HttpUtils.post("https://xorpay.com/api/pay/" + post.getAid(), map); System.out.println(result); JSONObject obj = JSON.parseObject(result); String qr = obj.getJSONObject("info").getString("qr"); // 将 支付二维码 存储到 指定目录 String saveName = CreateQRCode.getPic(qr, post.getPayCodeSavePath() + post.getOrderId() + "_");// 图片名称 File f = new File(post.getPayCodeSavePath() + post.getOrderId() + "_" + saveName); if (f.exists()) { // 二维码 下载 路径 return "http://xxx/res/ext/pays/" + post.getDate() + "/" + post.getOrderId() + "_" + saveName; }
- 上面代码先设置了一些xorpay native支付需要的必须参数。
- 然后请求 https://xorpay.com/api/pay/ 获取 支付二维码。
- 通过CreateQRCode.getPic 将二维码存储到指定目录(可以存储到nginx图片服务器路径),并且返回图片名称。
- 最后将二维码下载地址返回给前端。
上面获取二维码成功后,需要生成一个订单。下面是订单表:
CREATE TABLE `t_order` ( `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', `order_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '订单id', `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '支付手机号', `item_id` int DEFAULT '0' COMMENT '商品文章主键', `order_status` tinyint DEFAULT '0' COMMENT '订单状态, 0-待支付 1-已经支付', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=93 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单表';支付回调监听
@PostMapping("/pay/calback")
public String payCallback(@RequestParam("aoid") String aoid, @RequestParam("order_id") String orderId,
@RequestParam("pay_price") Float payPrice, @RequestParam("pay_time") String payTime,
@RequestParam("more") String more, @RequestParam("detail") String detail,
@RequestParam("sign") String sign) {
PayCallInfo info = new PayCallInfo();
info.setOrderId(orderId);
info.setPayPrice(payPrice);
info.setPayTime(payTime);
info.setMore(more);
info.setDetail(detail);
info.setSign(sign);
// 1. 插入回调记录
PayCallback callback = new PayCallback();
callback.setCreateTime(new Date());
callback.setBody(JSON.toJSONString(info));
payCallbackMapper.insert(callback);
// 2.修改订单表 状态为已支付
Order order = new Order();
order.setOrderId(orderId);
List orders = orderMapper.select(order).get(0);
orderDB.setOrderStatus(1);
orderMapper.updateByPrimaryKeySelective(orderDB);
// 添加支付记录
String[] mores = more.split("_");
UserPay userPay = new UserPay();
userPay.setCreateTime(new Date());
userPay.setHasPay(0);
userPay.setItemId(Integer.parseInt(mores[1]));
userPay.setOrderId(orderId);
userPay.setPhone(mores[0]);
userPay.setPrice(payPrice+"");
userPayMapper.insert(userPay);
return "ok";
}
xorpay 不支持json,只能是表单模式。
支付成功后需要:
- 记录支付回调,后面以免和xorpay扯皮。
- 修改订单表的状态。
- 添加用户支付记录。
支付回调记录表:
CREATE TABLE `t_pay_callback` ( `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', `body` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '回调信息', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='支付回调表';
用户支付记录表:
CREATE TABLE `t_user_pay` ( `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键', `order_id` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '订单ID', `item_id` int DEFAULT '0' COMMENT '文章的主键', `phone` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '用户手机号', `has_pay` tinyint DEFAULT '0' COMMENT '是否支付 0已经支付 1-删除支付', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `price` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '购买价格', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户支付记录表';
到此 支付 后台工作已经完成。
需要源工程代码的请联系我,qq:657455400 wx: hadluo
推荐一个Java架构师博客,带你一起写架构:java架构师修炼



