java微信支付dome-公众号支付为例(其他的支付都差不多)

1、导入微信支付sdk

 <!--   微信支付sdk包     -->
        <dependency>
            <groupId>com.github.wxpay</groupId>
            <artifactId>wxpay-sdk</artifactId>
            <version>0.0.3</version>
        </dependency>

2、实现微信的WXPayConfig接口

/**
 * @author xdy
 * @description 微信支付基础配置参数
 * @date 2020/12/11
 */
public class WechatPayConfig implements WXPayConfig {
    /**
     * appId
     */
    public static String appId = "wx12xxxx";
    /**
     * 商户id
     */
    public static String mchId = "xxxx064842";
    /**
     * key
     */
    public static String key = "xxxx02862083977";

    @Override
    public String getAppID() {
        return appId;
    }

    @Override
    public String getMchID() {
        return mchId;
    }

    @Override
    public String getKey() {
        return key;
    }

    @Override
    public InputStream getCertStream() {
        return null;
    }

    @Override
    public int getHttpConnectTimeoutMs() {
        return 0;
    }

    @Override
    public int getHttpReadTimeoutMs() {
        return 0;
    }
}

3、统一下单接口

 /**
     * 统一下单接口
     * @param body 订单描述
     * @param sub_mch_id 子商户号
     * @param openId 用户openid
     * @param out_trade_no 订单号
     * @param total_fee 下单金额
     * @param notify 支付结果通知地址
     * 官方文档地址:  https://pay.weixin.qq.com/wiki/doc/api/jsapi_sl.php?chapter=9_1
     * @return
     * @throws Exception
     */
    private Map<String,String> pay(String body,String sub_mch_id,String openId,String out_trade_no,String total_fee,String notify,String module_name,String sub_appid,String sub_openid) {
        WechatPayConfig payConfig = new WechatPayConfig();
        WXPay wxPay = new WXPay(payConfig);
        Map<String,String> map = new HashMap<>();
        // 子商户号
        map.put("sub_mch_id",sub_mch_id);
        // 商品描述
        map.put("body",body);
        // 订单号
        map.put("out_trade_no",out_trade_no);
        // 总金额
        map.put("total_fee",total_fee);
        // 终端ip
        map.put("spbill_create_ip","");
        // 回调地址
        map.put("notify_url","http://www.baidu.com");
        // 交易类型
        map.put("trade_type","JSAPI");
        // 用户openid
        if (StringUtils.isNotNull(openId)) {
            map.put("openid", openId);
        }
        if (StringUtils.isNotNull(sub_appid) || StringUtils.isNotEmpty(sub_appid)){
            map.put("sub_appid",sub_appid);
        }
        if (StringUtils.isNotNull(sub_openid) || StringUtils.isNotEmpty(sub_openid)) {
            map.put("sub_openid", sub_openid);
        }
        OrderSource orderSource = new OrderSource();
        orderSource.setUuid(UUIDUtils.getUUID());
        orderSource.setSubject(body);
        orderSource.setSubMchId(sub_mch_id);
        orderSource.setOutTradeNo(out_trade_no);
        orderSource.setTotalAmount(total_fee);
        orderSource.setPayType("WECHAT");
        orderSource.setNotify(notify);
        orderSource.setModuleName(module_name);
        orderSource.setOpenId(openId);
        orderSource.setSubAppId(sub_appid);
        orderSource.setSubAppId(sub_appid);
        Map<String,String> resp = new HashMap<>();
        try {
            logger.info(map.toString());
            resp = wxPay.unifiedOrder(map);
            orderSource.setReturnValue(resp.toString());
            if (resp.get("return_code").equals("SUCCESS")&&resp.get("result_code").equals("SUCCESS")){
                resp.put("appId", payConfig.getAppID());
                resp.put("timeStamp", String.valueOf(System.currentTimeMillis()/1000));
                resp.put("nonceStr", WXPayUtil.generateNonceStr());
                resp.put("signType", "MD5");
                resp.put("package", "prepay_id=" + resp.get("prepay_id"));
                String paySign = WXPayUtil.generateSignature(resp, payConfig.getKey());
                resp.put("paySign", paySign);
                orderSource.setPayStatus("CREATE");
                resp.put("result","SUCCESS");
            }else {
                orderSource.setPayStatus("CREATE_FAIL");
                resp.put("result","FAIL");
            }
        }catch (Exception e){
            e.printStackTrace();
            resp.put("result","FAIL");
        }
        try {
            System.out.println("新增订单记录(统一下单):"+DataSourceUtil.executeSql(DataSourceUtil.INSERT_ORDER,orderSource));
        }catch (Exception e){
            e.printStackTrace();
        }
        return resp;
    }

前端拿到统一下单返回值调用微信发起支付

4、支付回调

   /**
     * 下单结果通知
     * @param request
     * @param response
     * @throws Exception
     */
    @PostMapping("/notify")
    public void weixin_notify(HttpServletRequest request, HttpServletResponse response) throws Exception{
        //读取参数
        InputStream inputStream ;
        StringBuffer sb = new StringBuffer();
        inputStream = request.getInputStream();
        String s ;
        BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
        while ((s = in.readLine()) != null){
            sb.append(s);
        }
        in.close();
        inputStream.close();
        Map<String,String> map = WXPayUtil.xmlToMap(sb.toString());
        logger.debug("统一下单结果通知:"+map.toString());
        //判断签名是否正确
        String sign = WXPayUtil.generateSignature(map,new WechatPayConfig().getKey(), WXPayConstants.SignType.MD5);
        if(sign.equals(map.get("sign"))) {
            logger.debug("支付结果通知---签名验证成功》》》");
            //处理业务开始--
            String resXml = "";
            if("SUCCESS".equals(map.get("result_code"))){
                //执行自己的业务逻辑
         
                //告诉微信服务器,我收到信息了,不要在调用回调action了
                resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
                        + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
            } else {
              //执行自己的业务逻辑
                resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
                        + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
            }
            BufferedOutputStream out = new BufferedOutputStream(
                    response.getOutputStream());
            out.write(resXml.getBytes());
            out.flush();
            out.close();
        } else{
            logger.debug("通知签名验证失败");
        }
    }

完整的微信支付差不多就是这样了…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值