手记

【学习打卡】第13天 Java支付全家桶 企业级各类支付手段一站式解决方案(4-6)

课程名称:Java支付全家桶 企业级各类支付手段一站式解决方案

课程章节:4-6
课程名称:Java支付全家桶 企业级各类支付手段一站式解决方案

课程章节:4-6 创建支付订单

主讲老师:神思者

课程内容:

今天学习的内容包括:

创建支付订单,含:支付参数配置、创建 WXPayConfig 的子类、修改启动类的注解、创建支付订单接口调用实现、微信支付订单id不能重复。

课程收获:

1、支付参数配置,在application.yml添加以下配置:

application:
  wxpay:
    app-id: xxxx
    app-secret: xxxx
    mch-id: xxxx
    key: xxxx
    cert-path: C:/Project/zhifu/apiclient_cert.p12

2、创建 WXPayConfig 的子类,在开发支付之前,必须先创建 WXPayConfig 的子类,该子类主要用于加载支付相关的参数配置,其难度在于读取加载所配置的数字证书(思路,通过IO流将证书读取保存的字节数组内),其关键实现代码如下:

@Component
public class MyWXPayConfig extends WXPayConfig {

    private byte[] certData;

    @PostConstruct
    public void init() throws IOException {
        File file = new File(weiXinConfig.getCertPath());
        FileInputStream in = new FileInputStream(file);
        BufferedInputStream bin = new BufferedInputStream(in);

        this.certData = new byte[(int) file.length()];
        bin.read(this.certData);
        bin.close();
        in.close();
    }

……

    @Override
    InputStream getCertStream() {
        ByteArrayInputStream in = new ByteArrayInputStream(this.certData);
        return in;
    }
}

3、修改启动类的注解:为了让程序框架能够加载微信支付模块所定义的组件(如上文中自定义的 MyWXPayConfig ,就带了@Component 注解),所以需要修改启动类关于组件加载扫描的包路径,关键代码如下:

@SpringBootApplication
@ComponentScan({"com.github.wxpay.sdk", "io.renren"})
public class RenrenApplication {

	public static void main(String[] args) {
		SpringApplication.run(RenrenApplication.class, args);
	}

}

4、创建支付订单接口调用实现,关键代码如下:

// 向微信平台发送请求,创建支付订单
try {
    String code = IdUtil.fastSimpleUUID();
    WXPay wxPay = new WXPay(myWXPayConfig);
    Map<String, String> map = new HashMap();
    map.put("openid", openid);
    map.put("out_trade_no", code);
    map.put("total_fee", amount);
    map.put("attach", "附加数据-xx分店");
    map.put("body", "订单备注-JSAPI支付测试");
    map.put("spbill_create_ip", "127.0.0.1");
    map.put("notify_url", "https://haiten.virs.top/renren-fast/app/wx/recievePayMessage");
    map.put("trade_type", "JSAPI");
    Map<String, String> result = wxPay.unifiedOrder(map);
    String prepayId = result.get("prepay_id");

    if (null != prepayId && 0 != prepayId.length()) {
        order.setCode(code);
        order.setPrepayId(prepayId);
        orderService.updateById(order);

        // 生成数字签名
        String timeStamp = System.currentTimeMillis()+"";
        String nonceStr = WXPayUtil.generateNonceStr();
        String packageStr = "prepay_id=" + prepayId;
        String signType = "MD5";
        map.clear();
        map.put("timeStamp", timeStamp);
        map.put("nonceStr", nonceStr);
        map.put("package",packageStr );
        map.put("signType", signType);
        map.put("appId", weiXinConfig.getAppId());
        String paySign = WXPayUtil.generateSignature(map, weiXinConfig.getKey());

        return R.ok()
                .put("timeStamp", timeStamp)
                .put("nonceStr", nonceStr)
                .put("package", packageStr)
                .put("signType", signType)
                .put("paySign", paySign);
    } else {
        return R.error("微信支付模块故障");
    }
} catch (Exception e) {
    e.printStackTrace();
    return R.error("微信支付模块故障");
}

5、微信支付订单id不能重复,需要注意微信支付订单id不能重复。

今天看课程视频写手记的第13天,希望自己能坚持下去,为自己加油!

1人推荐
随时随地看视频
慕课网APP