一 基础准备 1.微信支付业务—商户注册微信支付业务通过微信平台为商家提供代收款服务
- 网址 https://pay.weixin.qq.com
注册后会获得 - 商户编号:1497984412**
商户账号AppID:wx632c8f211f8122c6**
商户Key:sbNCm1JnevqI36LrEaxFwcaT0hkGxFnC**
2.1 导入微信支付的依赖⽀付订单,并不是⽤户提交的商品订单,⽽是商户向微信⽀付平台申请的支付链接url
- wxpay的maven依赖
二 实现流程 1.流程图 2.代码实现 2.1 配置类-配置商户信息com.github.wxpay wxpay-sdk 0.0.3
- 创建⼀个配置类,实现WxPayConfig接⼝
重写三分⽅法,分别设置商户AppID商户ID商户密钥
public class MyPayConfig implements WXPayConfig {
@Override
public String getAppID() {
return "wx632c8f211f8122c6";
}
@Override
public String getMchID() {
return "1497984412";
}
@Override
public String getKey() {
return "sbNCm1JnevqI36LrEaxFwcaT0hkGxFnC";
}
@Override
public InputStream getCertStream() {
return null;
}
@Override
public int getHttpConnectTimeoutMs() {
return 0;
}
@Override
public int getHttpReadTimeoutMs() {
return 0;
}
}
2.2 订单添加接口实现
需要通过配置一个Map来 设置支付订单的参数 发送给微信支付端接口
@RestController
@CrossOrigin
@RequestMapping("/order")
@Api(value = "提供订单相关的操作接口",tags = "订单管理")
public class OrderController {
@Autowired
private OrderService orderService;
@PostMapping("/add")
public ResultVO add(String cids, @RequestBody Orders order){
ResultVO resultVO = null;
try {
Map orderInfo = orderService.addOrder(cids, order);
if(orderInfo!=null){
String orderId = orderInfo.get("orderId");
//设置当前订单信息
HashMap data = new HashMap<>();
data.put("body",orderInfo.get("productNames")); //商品描述
data.put("out_trade_no",orderId); //使用当前用户订单的编号作为当前支付交易的交易号
data.put("fee_type","CNY"); //支付币种
data.put("total_fee",order.getActualAmount()*100+""); //支付金额(以分为单位 要乘以100)
data.put("trade_type","NATIVE"); //交易类型
data.put("notify_url","http://47.118.45.73:8080/pay/callback"); //设置支付完成时的回调方法接口(微信端收到钱会向此url发送支付完成信息)
//发送请求,获取响应
//微信支付:申请支付连接
WXPay wxPay = new WXPay(new MyPayConfig());
Map resp = wxPay.unifiedOrder(data);
//resp是支付完成 微信端返回的一Map格式传输数据 里面有支付地址 -code_url
orderInfo.put("payUrl",resp.get("code_url"));
//orderInfo中包含:订单编号,购买的商品名称,支付链接
//返回给前端页面ResultVO 前端页面通过payUrl生成支付二维码完成支付
resultVO = new ResultVO(ResStatus.OK,"提交订单成功!",orderInfo);
}else{
resultVO = new ResultVO(ResStatus.NO,"提交订单失败!",null);
}
} catch (SQLException e) {
resultVO = new ResultVO(ResStatus.NO,"提交订单失败!",null);
} catch (Exception e) {
e.printStackTrace();
}
return resultVO;
}
}
2.3支付回调接口
⽀付回调:当⽤户⽀付成功之后,⽀付平台会向我们指定的服务器接⼝发送请求传递订单⽀付状态数据
@RestController
@RequestMapping("/pay")
public class PayController {
@Autowired
private OrderService orderService;
@RequestMapping("/callback")
public String paySuccess(HttpServletRequest request) throws Exception {
System.out.println("--------------------callback");
// 1.接收微信支付平台传递的数据(使用request的输入流接收)
ServletInputStream is = request.getInputStream();
byte[] bs = new byte[1024];
int len = -1;
StringBuilder builder = new StringBuilder();
while((len = is.read(bs))!=-1){
builder.append(new String(bs,0,len));
}
String s = builder.toString();
//使用帮助类将xml接口的字符串装换成map
Map map = WXPayUtil.xmlToMap(s);
//如果回调信息中result_code为success则支付成功
if(map!=null && "success".equalsIgnoreCase(map.get("result_code"))){
//支付成功
//2.修改订单状态为“待发货/已支付”
String orderId = map.get("out_trade_no");
int i = orderService.updateOrderStatus(orderId, "2");
System.out.println("--orderId:"+orderId);
//3.通过websocket连接,向前端推送消息 来修改支付页面 显示完成订单支付
WebSocketServer.sendMsg(orderId,"1");
//4.再次响应微信支付平台-结束本次支付链接 (否则微信端会一直周期的向此接口发送订单信息)
if(i>0){
HashMap resp = new HashMap<>();
resp.put("return_code","success");
resp.put("return_msg","OK");
resp.put("appid",map.get("appid"));
resp.put("result_code","success");
return WXPayUtil.mapToXml(resp);
}
}
return null;
}
}
三 实现效果
-
支付订单页面
-
支付完成
//设置当前订单信息 HashMapdata = new HashMap<>(); data.put("body",orderInfo.get("productNames")); //商品描述 data.put("out_trade_no",orderId); //使用当前用户订单的编号作为当前支付交易的交易号 data.put("fee_type","CNY"); //支付币种 data.put("total_fee",order.getActualAmount()*100+""); //支付金额(以分为单位 要乘以100) data.put("trade_type","NATIVE"); //交易类型 data.put("notify_url","http://47.118.45.73:8080/pay/callback"); //此地址为公网ip地址可以接收微信端信息
如果按照上面所示的配置,当⽤户⽀付成功之后,微信⽀付平台会向http://192.168.55.3:8080/pay/callback发送请求,
但我们的服务端项⽬是运⾏在本地计算机的(IP为内⽹IP),微信平台没办法访问内网只能访问公网
所以 我们可以通过两种方法实现:1.内网穿透—Ngrok 2.购买服务器将项目上云



