二维码扫描付款和系统用户如何对应?

Jfinal.com  的捐助 和加入俱乐部时,扫支付宝或微信二维码,付款后就能和系统用户直接对应起来,这个是如何实现的? 

谁能给个方案? club的源代码中好像没有这部分的代码。

评论区

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 看您的二维码好像是固定的呢?

热门反馈

扫码入社