首页
App
&
Coffee
文档
项目
分享
反馈
俱乐部
登录
注册
二维码扫描付款和系统用户如何对应?
ruguoaaa
2019-03-29 16:52
Jfinal.com 的捐助 和加入俱乐部时,扫支付宝或微信二维码,付款后就能和系统用户直接对应起来,这个是如何实现的?
谁能给个方案? club的源代码中好像没有这部分的代码。
项目:
JFinal
4
3
评论区
JFinal
2019-03-29 17:29
jfinal.com 中的微信扫码支付过程大致如下:
1:在 ClubService 生成一个订单号:
public class ClubService {
// 微信官方提供的二维码扫描支付的 url 调用接口
static final String qr_code_gen_url = "weixin://wxpay/bizpayurl?sign=%s&appid=%s&mch_id=%s&product_id=%s&time_stamp=%s&nonce_str=%s";
/**
* 1:为了避免在生成二维码时就创建订单,需要在 product_id 中包含元信息
* yyyyMMddHHmmss-c1-accountId,其中 c1 表示 club 订阅 1 年
*/
public String genClubPaymentQrCodeString(Account account) {
String productId = genProductIdAlsoClubOrderId(account, years);
Kv signPara = Kv.create()
.set("appid", appid)
.set("mch_id", mch_id)
.set("product_id", productId)
.set("time_stamp", Long.toString(System.currentTimeMillis() / 1000))
.set("nonce_str", Long.toString(System.currentTimeMillis()));
String sign = PaymentKit.createSign(signPara, paternerKey);
return String.format(
qr_code_gen_url, sign, appid, mch_id,
productId,
signPara.getStr("time_stamp"),
signPara.getStr("nonce_str"));
}
}
注意看上面的代码 PaymentKit 创建了 sign 参数,最后用 String.format 将 qr_code_gen_url 中的参数更新成你项目中的实际参数
2:在 ClubController 中使用 ClubService.generatePaymentQrCodeString() 方法得到一个 String 参数,也即二维码数据,使用下面的代码生成二维码,让用户扫码支付:
public class ClubController extends BaseController {
@Inject
ClubPaymentService srv;
public void genClubPaymentQrCode() {
String qrCodeContent = srv.generatePaymentQrCodeString(getLoginAccount());
renderQrCode(qrCodeContent, 215, 215);
}
}
以上两步即可完成用户支付的核心流程
回复
JFinal
2019-03-29 17:31
剩下的就是处理用户支付完成后,微信服务端的回调了,微信回调时会将 product_id 参数再发回给你,例如你前面生成的订单号是:yyyyMMddHHmmss-c1-accountId
其中的 accountId 就是你网站用户的 id 号,拿到用户 id 以及订单号,就可以继续完成后续流程了
回复
JFinal
2019-03-29 17:39
支付完成回调的 controller 中的 action 大致代码如下:
// 接收微信支付成功后回调的 action,如果响应延迟超过 5 秒
// 微信服务端会重发该回调,所以要注意对重发的回调去重
// 最简单方法是在支付记录中用一个字段做确认标记
public void weixinpay_callback() {
String callbackString = getRawData();
Map callbackPara = PaymentKit.xmlToMap(callbackString);
// 通过微信的回调参数 produect_id 可以得到用户 id,进而得到 Account 对象
Account account = srv.getAccountFromCallBackPara(callbackPara);
String ip = IpKit.getRealIp(getRequest());
// 生成微信回调的响应 xml,告知已确认了该笔支付
String orderXml = srv.makeOrder(account, callbackPara, ip, ClubPaymentService.notify_url);
// 发送给微信息服务端
renderText(orderXml);
}
回复
JFinal
2019-03-29 17:40
关于支付工作到的 API 在 jfinal weixin 中都有
回复
ruguoaaa
2019-03-29 18:04
谢谢,波总!!
回复
jfinal009
2019-03-29 22:51
生成的二维码是固定的,还是动态的,每次都变化?
回复
JFinal
2019-03-30 08:27
@jfinal009
String qr_code_gen_url = "weixin://wxpay/bizpayurl?sign=%s&appid=%s&mch_id=%s&product_id=%s&time_stamp=%s&nonce_str=%s";
上面的 qr_code_gen_url 中的一部分参数是动态变化的,使用 String.format(
qr_code_gen_url, ....) 生成出来的用于渲染二维码的 String 值是动态的,因此是动态的
回复
jfinal009
2019-03-30 14:15
@JFinal
看您的二维码好像是固定的呢?
回复
发送
我要反馈
热门反馈
扫码入社
1:在 ClubService 生成一个订单号:
public class ClubService {
// 微信官方提供的二维码扫描支付的 url 调用接口
static final String qr_code_gen_url = "weixin://wxpay/bizpayurl?sign=%s&appid=%s&mch_id=%s&product_id=%s&time_stamp=%s&nonce_str=%s";
/**
* 1:为了避免在生成二维码时就创建订单,需要在 product_id 中包含元信息
* yyyyMMddHHmmss-c1-accountId,其中 c1 表示 club 订阅 1 年
*/
public String genClubPaymentQrCodeString(Account account) {
String productId = genProductIdAlsoClubOrderId(account, years);
Kv signPara = Kv.create()
.set("appid", appid)
.set("mch_id", mch_id)
.set("product_id", productId)
.set("time_stamp", Long.toString(System.currentTimeMillis() / 1000))
.set("nonce_str", Long.toString(System.currentTimeMillis()));
String sign = PaymentKit.createSign(signPara, paternerKey);
return String.format(
qr_code_gen_url, sign, appid, mch_id,
productId,
signPara.getStr("time_stamp"),
signPara.getStr("nonce_str"));
}
}
注意看上面的代码 PaymentKit 创建了 sign 参数,最后用 String.format 将 qr_code_gen_url 中的参数更新成你项目中的实际参数
2:在 ClubController 中使用 ClubService.generatePaymentQrCodeString() 方法得到一个 String 参数,也即二维码数据,使用下面的代码生成二维码,让用户扫码支付:
public class ClubController extends BaseController {
@Inject
ClubPaymentService srv;
public void genClubPaymentQrCode() {
String qrCodeContent = srv.generatePaymentQrCodeString(getLoginAccount());
renderQrCode(qrCodeContent, 215, 215);
}
}
以上两步即可完成用户支付的核心流程