课程名称: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天,希望自己能坚持下去,为自己加油!