文档: https://pay.weixin.qq.com/wiki/doc/api/index.html
微信小程序:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
需要一个微信认证后的小程序,,还需要一个,在微信商户平台,,开通的商户,,将商户和小程序绑定到一起,,
用户在微信小程序上下单:
- 需要知道是哪个用户下的单,,也就是openid
- 需要知道小程序id,,商户id,,根据商户的秘钥key,生成一个签名
签名是为了防止数据别篡改,,,
怎么获取openid:
@PostMapping("/login")public Map<String,String> login(@RequestBody @Valid WxLoginForm loginForm){String url = "https://api.weixin.qq.com/sns/jscode2session";HashMap<String, Object> map = new HashMap<>();map.put("appid",appid);map.put("secret",secret);map.put("js_code",loginForm.getCode());map.put("grant_type","authorization_code");String response = HttpUtil.post(url, map);JSONObject obj = JSONUtil.parseObj(response);String openid = obj.getStr("openid");if (openid == null || openid.length()==0){throw new ParameterException(99999);}User user = userRepository.findByOpenid(openid);Long uid;if (user ==null){// 注册User newUser = new User();BeanUtils.copyProperties(loginForm,newUser);newUser.setOpenid(openid);userRepository.save(newUser);uid = newUser.getId();}else{// 登录uid = user.getId();}// 生成令牌String token = JwtToken.makeToken(uid);HashMap<String, String> map1 = new HashMap<>();map1.put("token",token);// 根据 主键id生成tokenreturn map1;}
怎么向微信统一下单:
微信SDK中有一个 WXPayConfig
抽象类,,继承这个类,,将你的wx支付的配置写进去
// ccWxPayConfig自己的wx配置WXPay wxPay = new WXPay(ccWxPayConfig);// 下单成功会返回一个 prepay_idMap<String, String> result = wxPay.unifiedOrder(map);
// 将prepay_id更新到order中
// 生成前端的数字签名,, 前端生成签名比较麻烦,后端生成之后传递给前端String paySign = WXPayUtil.generateSignature(map2, key);
前端根据回传的信息,请求微信服务器获取支付信息,,,用户确认金额后,选择支付或者取消支付
支付完成后,微信会支付结果通知
如果没有接到通知,,也可以自己主动发出通知:
/*** 主动 去 微信 查询支付状态*/@PostMapping("/updateOrderStatus")@ScopeLevel@Transactionalpublic void updateOrderStatus(String orderNo) throws Exception {// 验证这个订单是不是这个用户的Long uid = LocalUser.getUser().getId();Long orderId = 1L;Order order = orderRepository.findFirstByUserIdAndId(uid, orderId).orElseThrow(() -> new ServerErrorException(9999));HashMap<String, String> map = new HashMap<>();map.put("appid",appid);map.put("mch_id",mchId);map.put("out_trade_no",order.getOrderNo());map.put("nonce_str",WXPayUtil.generateNonceStr());String sign = WXPayUtil.generateSignature(map, key);map.put("sign",sign);WXPay wxPay = new WXPay(ccWxPayConfig);Map<String, String> result = wxPay.orderQuery(map);String returnCode = result.get("return_code");String resultCode = result.get("result_code");if ("SUCCESS".equals(returnCode) && "SUCCESS".equals(resultCode)){String tradeState = result.get("trade_state");if ("SUCCESS".equals(tradeState)){// 交易成功,,更新状态
// orderRepository.orderRepository.updateOrderStatus(order.getOrderNo(),2);}else{
// return new UnifyResponse()throw new ServerErrorException(9999);}}}