美文网首页Java
微信公众号支付

微信公众号支付

作者: Liuluckyzz | 来源:发表于2019-11-22 12:13 被阅读0次

最近在做一个项目中的一个小功能是关于微信支付的,在这里总结一下代码

微信支付:

//C端微信支付
    public String CDWeiXinPay(HttpServletRequest request,
                              HttpServletResponse response) {
        Map<String, String> map = getRequestParams(request);
        CallResult result = new CallResult();
        try {
            String paramContent = "";
            String sign = "";
            String nonceStr = CheckUtil.generateNonceStr();
            Map<String, String> param = new HashMap<>();
            param.put("appid", WeiXinConst.APPID); //公众号id
            param.put("mch_id", WeiXinConst.MCHID);//商户平台id
            param.put("device_info", "WEB");
            param.put("nonce_str", nonceStr);
            param.put("body", "蚁传播公众号支付");//订单标题
            param.put("out_trade_no", map.get("orderId"));//订单ID
            param.put("total_fee",  map.get("payAmount")); //订单需要支付的金额
            param.put("trade_type", "JSAPI");//交易类型 JSAPI 公众号支付 NATIVE 扫码支付 APP APP支付
            param.put("notify_url",WeiXinConst.cd_notify_url);//notify_url 支付成功之后 微信会进行异步回调的地址
            param.put("openid", map.get("openId"));//微信授权获取openId
            param.put("sign_type", "MD5");
            sign = WXPayUtil.generateSignature(param,WeiXinConst.KEY);
            param.put("sign", sign);
            paramContent = WXPayUtil.mapToXml(param);
            String s = OkHttpUtil.getInstance().doPost(WeiXinConst.sm_weiXinPay_url, paramContent);//微信支付路径
            Map<String, String> returnResult = WXPayUtil.xmlToMap(s);
            String prepay_id;
            HashMap<String, String> pageParam = new HashMap<>();
            if (returnResult.get("return_code").equals("SUCCESS") && returnResult.get("result_code").equals("SUCCESS")) {
                prepay_id = returnResult.get("prepay_id");
                String timestamp = CheckUtil.create_timestamp();
                pageParam.put("appId", WeiXinConst.APPID);
                pageParam.put("nonceStr", nonceStr);
                pageParam.put("package", "prepay_id=" + prepay_id);
                pageParam.put("timeStamp", timestamp);
                pageParam.put("signType", "MD5");
                String pageSign =WXPayUtil.generateSignature(pageParam,WeiXinConst.KEY);
                pageParam.put("paySign", pageSign);
                pageParam.put("prepay_id", prepay_id);
                result.addSuccess("请求成功");
            } else {
                result.addError("请求失败");
            }
            result.setData(pageParam);
            System.out.println("--------------------"+JsonUtil.transformObject(result)+"--------------------------------------");
            logger.info(result);
        } catch (Exception e) {
            logger.error(e.toString(), e);
            result.addError("服务器异常:" + e.getMessage());
        }
        return JsonUtil.transformObject(result);
    }
public static String generateNonceStr() {
        return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);
    }
public class OkHttpUtil {
    private static OkHttpUtil okHttpUtil;
    private static OkHttpClient okHttpClient;
    private OkHttpUtil() {
        /**
         * OkHttp是一个第三方类库,
         * 用于android中请求网络
         * 创建OkHttpClient对象
         */
        okHttpClient = new OkHttpClient();
    }
    public static OkHttpUtil getInstance() {
        if (okHttpUtil == null) {
            okHttpUtil = new OkHttpUtil();
        }
        return okHttpUtil;
    }

    public String doGet(String url) {
        /**
         * 请求接口
         * 创建Request对象
         */
        Request request = new Request.Builder()
                .url(url)
                .build();
        //得到request对象
        Call call = okHttpClient.newCall(request);
        try {
            Response response = call.execute();
            return response.body().string();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public String doPost(String url, Map<String, String> param) {
        FormBody.Builder builder = new FormBody.Builder();
        for (Map.Entry<String, String> entry : param.entrySet()) {
            builder.add(entry.getKey(), entry.getValue());
        }
        RequestBody body = builder.build();
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        Call call = okHttpClient.newCall(request);
        try {
            Response response = call.execute();
            return response.body().string();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public String doPostParam(String url, Map<String, Object> param) {
        FormBody.Builder builder = new FormBody.Builder();
        for (Map.Entry<String, Object> entry : param.entrySet()) {
            builder.add(entry.getKey(), (String) entry.getValue());
        }
        RequestBody body = builder.build();
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        Call call = okHttpClient.newCall(request);
        try {
            Response response = call.execute();
            return response.body().string();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public String doPost(String url, String param) {
        MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        RequestBody body = RequestBody.create(JSON, param);
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        Call call = okHttpClient.newCall(request);
        try {
            Response response = call.execute();
            return response.body().string();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
public class CheckUtil {
    /**
     * 生成签名. 注意,若含有sign_type字段,必须和signType参数保持一致。
     * @param data 待签名数据
     * @param key API密钥
     * @param signType 签名方式
     * @return 签名
     */
    public static String generateSignature(final Map<String, String> data, String key, WXPayConstants.SignType signType) throws Exception {
        Set<String> keySet = data.keySet();
        String[] keyArray = keySet.toArray(new String[keySet.size()]);
        Arrays.sort(keyArray);
        StringBuilder sb = new StringBuilder();
        for (String k : keyArray) {
            if (k.equals(WXPayConstants.FIELD_SIGN)) {
                continue;
            }
            if (data.get(k).trim().length() > 0) // 参数值为空,则不参与签名
                sb.append(k).append("=").append(data.get(k).trim()).append("&");
        }
        sb.append("key=").append(key);
        if (WXPayConstants.SignType.MD5.equals(signType)) {
            return MD5(sb.toString()).toUpperCase();
        }
        else if (WXPayConstants.SignType.HMACSHA256.equals(signType)) {
            return HMACSHA256(sb.toString(), key);
        }
        else {
            throw new Exception(String.format("Invalid sign_type: %s", signType));
        }
    }
    /**
     * 通过HttpServletRequest返回IP地址
     * @param request HttpServletRequest
     * @return ip String
     * @throws Exception
     */
    public static String getIpAddr(HttpServletRequest request) throws Exception {
        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.getHeader("HTTP_CLIENT_IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }
    public static String generateNonceStr() {
        return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);
    }
    public static String getXMLFromMap(Map<String, String> map) throws Exception {
        StringBuffer sb = new StringBuffer();
        sb.append("<xml>");
        Set<String> set = map.keySet();
        Iterator<String> it = set.iterator();
        while (it.hasNext()) {
            String key = it.next();
            sb.append("<" + key + ">").append(map.get(key)).append("</" + key + ">");
        }
        sb.append("</xml>");
        return sb.toString();
    }
    /**
     * XML格式字符串转换为Map
     *
     * @param strXML XML字符串
     * @return XML数据转换后的Map
     * @throws Exception
     */
    public static Map<String, String> xmlToMap(String strXML) throws Exception {
        try {
            Map<String, String> data = new HashMap<String, String>();
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8"));
            org.w3c.dom.Document doc = documentBuilder.parse(stream);
            doc.getDocumentElement().normalize();
            NodeList nodeList = doc.getDocumentElement().getChildNodes();
            for (int idx = 0; idx < nodeList.getLength(); ++idx) {
                Node node = nodeList.item(idx);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    org.w3c.dom.Element element = (org.w3c.dom.Element) node;
                    data.put(element.getNodeName(), element.getTextContent());
                }
            }
            try {
                stream.close();
            } catch (Exception ex) {
                // do nothing
            }
            return data;
        } catch (Exception ex) {
            throw ex;
        }
    }
    public static String create_timestamp() {
        return Long.toString(System.currentTimeMillis() / 1000);
    }
}
上面代码里WeiXinConst实体类中主要是配置了微信支付的一系列的参数。微信支付中所需要的参数都可以写到这个实体类中,在支付成功之后微信会自动回调我们在上面配置的微信回调地址,进行支付成功之后的操作。

相关文章

  • PHP微信公众号支付开发总结

    微信公众号开发是很常见的开发,其中微信支付占有很大的比重。微信公众号分为服务号和订阅号,服务号支持微信支付。 前期...

  • 关注公众号领红包常见问题解答

    一、关注领红包对公众号的要求: 公众号必须开通“微信支付”和“现金红包”功能权限 登录微信公众平台 – 微信支付(...

  • 微信公众号配置

    微信支付 - 商户平台 商户号 支付证书 微信公众号 appid & appscret 开发 > 基本配置 > ...

  • 【微信】支付

    公众号支付 调用微信js支付接口的页面,必须接口域名授权。在公众平台中设置,最多可以授权3个。 使用微信公众号支付...

  • 关于微信公众号发红包|应该知道的几种玩法

    微信公众号发红包首先必须是开通微信支付了的公众号,支持开通微信支付的公众号类型包括:服务号和主体为政府或媒体资质的...

  • 微信支付

    公众号支付是指在微信app中访问的页面通过js直接调起微信支付; 一:设置域名 登录微信公众平台; 微信支付中设置...

  • 微信公众号网页支付summer版

    该文仅对于中间这种支付方式有参考价值哟 一、开发背景 在微信公众号中,需要进行微信支付且为微信公众号网页支付。 二...

  • 商城商品微信支付

    本次我们主要介绍的是公众号支付 1.当我们自己有微信公众号,开通了微信支付业务 2.我们到微信支付的官网,http...

  • 2019-08-19

    blog在线点单备案图标微信公众号微信支付微信赞赏支付宝出行红包支付宝支付支付宝红包

  • 微信支付

    微信公众号支付分为三类 以下主要介绍公众号H5授权支付 首先看一下微信支付的业务逻辑 大部分微信支付逻辑在于服务器...

网友评论

    本文标题:微信公众号支付

    本文链接:https://www.haomeiwen.com/subject/mpifwctx.html