微信小程序支付

pom.xml

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

配置文件

public class WxConfig implements WXPayConfig {
    @Override
    public String getAppID(){
        return MyWxPayConfig.appid;
    }

    @Override
    public String getMchID(){
        return MyWxPayConfig.mch_id;
    }

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

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

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

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

}
public class MyWxPayConfig {
    /**小程序ID*/
    public static final String appid = "1";
    /**小程序appSecret*/
    public static final String appSecret = "1";
    /**微信支付的商户id*/
    public static final String mch_id = "1";
    /**微信支付的商户秘钥*/
    public static final String key = "1";
    /**获取openId接口*/
    public static final String get_openid_url ="https://api.weixin.qq.com/sns/jscode2session";
    /**支付成功后的服务器回调url*/
    public static final String notify_url = "http://47.93.87.216:8081/wx/notify";
}

工具类

public class ConvertUtils {
    /**
     * 输入流转换为xml字符串
     * @param inputStream
     * @return
     */
    public static String convertToString(InputStream inputStream) throws IOException {
        ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = inputStream.read(buffer)) != -1) {
            outSteam.write(buffer, 0, len);
        }
        outSteam.close();
        inputStream.close();
        String result  = new String(outSteam.toByteArray(), "utf-8");
        return result;
    }
}

Controller

//在controller层
@RequestMapping("/wx")
@RestController
public class WXPayController {
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private WxPayService wxPayService;

    @GetMapping("/pay")
    @ResponseBody
    /**后台统一下单接口*/
    public Result pay(HttpServletRequest request,@RequestBody PayParam Param) throws Exception {
        String openid = Param.getOpenid();
        String orderNo = Param.getOrderNo();
        Double totalMoney = Param.getTotalMoney();
        // 获取真实请求ip地址,避免获取代理ip
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        if (ip.indexOf(",") != -1) {
            String[] ips = ip.split(",");
            ip = ips[0].trim();

        }
        return wxPayService.wxPay(openid, orderNo, totalMoney, ip);
    }

    @RequestMapping("/notify")
    public void notifyLogic(HttpServletRequest request, HttpServletResponse response) {
        try {
            //1.输入流转换为字符串
            String xml = ConvertUtils.convertToString(request.getInputStream());

            //2.基于微信发送的通知内容,完成后续的业务逻辑处理
            //使用微信支付sdk中的工具类,将xml转换成map
            Map<String, String> map = WXPayUtil.xmlToMap(xml);
            if ("SUCCESS".equals(map.get("result_code"))) {
                //支付成功回调
                //给微信一个结果通知
                response.setContentType("text/xml");
                String data="<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
                response.getWriter().write(data);

                //执行支付成功后的业务逻辑
                //例如:修改订单的支付状态为已支付
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Service

@Service
public class WxPayService {

    public Result wxPay(String openid, String orderNo, Double totalMoney, String ip) {
        try {
            /**1. 拼接统⼀下单地址参数*/
            Map<String, String> paraMap = new HashMap<String, String>();
            /**用户标识*/
            paraMap.put("openid",openid);
            /**商品描述*/
            paraMap.put("body", "充值佣金");
            /**订单号*/
            paraMap.put("out_trade_no", orderNo);
            /**金额转换*/
            BigDecimal payMoney = new BigDecimal(totalMoney);
            /**100 = 1*/
            BigDecimal fen = payMoney.multiply(new BigDecimal("100"));
            fen = fen.setScale(0, BigDecimal.ROUND_UP);
            /**付⾦额,单位分,即0.01元*/
            paraMap.put("total_fee", String.valueOf(fen));
            /**终端ip*/
            paraMap.put("spbill_create_ip", ip);
            /**支付结果通知地址*/
            paraMap.put("notify_url","http://zq32586844.qicp.vip/wx/notify");
            /**交易类型*/
            paraMap.put("trade_type", "JSAPI");

            //2.发送post请求"统一下单接口", 返回预支付id:prepay_id
            WxConfig config = new WxConfig();
            WXPay wxpay = new WXPay(config);
            Map<String, String> map = wxpay.unifiedOrder(paraMap);
            String prepayId = (String) map.get("prepay_id");

            //3.将数据组合,再次签名
            Map<String, String> payMap = new HashMap<String, String>();
            payMap.put("appId", MyWxPayConfig.appid);
            payMap.put("timeStamp", System.currentTimeMillis() + "");
            payMap.put("nonceStr", WXPayUtil.generateNonceStr());
            payMap.put("signType", WXPayConstants.HMACSHA256);
            payMap.put("package", "prepay_id=" + prepayId);
            //通过appId, timeStamp, nonceStr, signType, package及商户密钥进⾏key=value形式拼接并加密
            String paySign = WXPayUtil.generateSignature(payMap, MyWxPayConfig.key,WXPayConstants.SignType.HMACSHA256);
            payMap.put("paySign", paySign);

            //4.将参数传给前端
            return Result.ok("调用统一下单接口,成功!", payMap);
        } catch (Exception e) {
            e.printStackTrace();
            return Result.error("调用统一下单接口,失败!");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值