微信支付v2

文档: 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生成token



        return map1;
    }

怎么向微信统一下单:
微信SDK中有一个 WXPayConfig抽象类,,继承这个类,,将你的wx支付的配置写进去

// ccWxPayConfig自己的wx配置
 WXPay wxPay = new WXPay(ccWxPayConfig);
 // 下单成功会返回一个 prepay_id
 Map<String, String> result = wxPay.unifiedOrder(map);
// 将prepay_id更新到order中
// 生成前端的数字签名,, 前端生成签名比较麻烦,后端生成之后传递给前端
 String paySign = WXPayUtil.generateSignature(map2, key);

前端根据回传的信息,请求微信服务器获取支付信息,,,用户确认金额后,选择支付或者取消支付

支付完成后,微信会支付结果通知微信支付v2_第1张图片

如果没有接到通知,,也可以自己主动发出通知:


    /**
     * 主动 去 微信 查询支付状态
     */
    @PostMapping("/updateOrderStatus")
    @ScopeLevel
    @Transactional
    public 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);
            }
        }
    }

你可能感兴趣的:(微信,java)