栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 聚合支付 实战 XorPay

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 聚合支付 实战 XorPay

请看效果

支付项目成果视频

效果很简单:

  • 用户输入手机号登录。
  • 登录成功,也注册成功,然后请求支付二维码。
  • 用户扫码付款,然后后端接收支付回调,更改用户已支付。
  • 用户点击按钮刷新页面,发现已支付,查看商品文章。

本文章以 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 ,接下来就是获取支付二维码:

Map map = 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架构师修炼

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/271233.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号