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