小程序订单下单支付

小程序后端支付

package com.litte.util;

import com.litte.entity.PayUtil;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.*;

/**
 * Created by Administrator on 2018/12/22.
 */
public class TestJxx {

    public static void main(String[] args) throws Exception {
        PayUtil payUtil = new PayUtil();
        payUtil.setAppid("appId"); // 小程序APPID
        payUtil.setMch_id("mchId"); // 商户号
        payUtil.setPayKey("payKey"); // 支付秘钥
        payUtil.setBody("商品名称"); // 商品简单描述,该字段请按照规范传递 必填
        payUtil.setOut_trade_no("20190825155036"); // 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*且在同一个商户号下唯一 必填
        payUtil.setNonce_str("0140944616C441F6B46B4B5660B9CBA7"); // 随机字符串,长度要求在32位以内。 必填
        payUtil.setTotal_fee(3000); // 订单总金额,单位为分  必填
        payUtil.setDevice_info("WEB"); // 自定义参数,可以为终端设备号(门店号或收银设备ID),PC网页或公众号内支付可以传"WEB" 设备号
        payUtil.setNotify_url("支付回调地址"); // 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。 必填
        payUtil.setOpenid("oppenId"); // trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。openid如何获取 必填

        wxPay(payUtil);
    }

    /**
     * 支付
     *
     * @param payUtil
     * @throws Exception
     */
    public static Map<String, Object> wxPay(PayUtil payUtil) throws Exception {
        //生成的随机字符串
        String stringA = "appid=" + payUtil.getAppid()
                + "&body=" + payUtil.getBody()
                + "&mch_id=" + payUtil.getMch_id()
                + "&nonce_str=" + payUtil.getNonce_str()
                + "&notify_url=" + payUtil.getNotify_url()
                + "&openid=" + payUtil.getOpenid()
                + "&out_trade_no=" + payUtil.getOut_trade_no()
                + "&spbill_create_ip=IP"
                + "&total_fee=" + payUtil.getTotal_fee()
                + "&trade_type=JSAPI"
                + "&key=" + payUtil.getPayKey();
        String sign = Md5Util.md5(stringA).toUpperCase();

        String xml = "<xml>" +
                "   <appid>" + payUtil.getAppid() + "</appid>" +
                "   <body>" + payUtil.getBody() + "</body>" +
                "   <mch_id>" + payUtil.getMch_id() + "</mch_id>" +
                "   <nonce_str>" + payUtil.getNonce_str() + "</nonce_str>" +
                "   <notify_url>" + payUtil.getNotify_url() + "</notify_url>" +
                "   <openid>" + payUtil.getOpenid() + "</openid>" +
                "   <out_trade_no>" + payUtil.getOut_trade_no() + "</out_trade_no>" +
                "   <spbill_create_ip>IP</spbill_create_ip>" +
                "   <total_fee>" + payUtil.getTotal_fee() + "</total_fee>" +
                "   <trade_type>JSAPI</trade_type>" +
                "   <sign>" + sign + "</sign>" +
                "</xml> ";

        //调用统一下单接口,并接受返回的结果
        String result = BasePay.httpRequest("https://api.mch.weixin.qq.com/pay/unifiedorder", "POST", xml);
        // 将解析结果存储在HashMap中
        Map map = doXMLParse(result);

        String nonceStr = UUIDUtil.getUUID().toUpperCase();
        String dateTime = String.valueOf(new Date().getTime());
        String signType = "MD5";
        String packages = "prepay_id=" + map.get("prepay_id").toString();
        String paySign = "appId=" + map.get("appid")
                + "&nonceStr=" + nonceStr
                + "&package=" + packages
                + "&signType=" + signType
                + "&timeStamp=" + dateTime
                + "&key=" + payUtil.getPayKey();

        // 拼装返回小程序调起支付操作
        map.put("timeStamp", dateTime);
        map.put("paySign", Md5Util.md5(paySign).toUpperCase());
        map.put("nonceStr", nonceStr);
        map.put("signType", signType);
        map.put("package", packages);

        return map;
    }

    /**
     * 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。
     *
     * @param strxml
     * @return
     */
    public static Map doXMLParse(String strxml) throws Exception {
        if (null == strxml || "".equals(strxml)) {
            return null;
        }
        Map m = new HashMap();
        InputStream in = String2Inputstream(strxml);
        SAXBuilder builder = new SAXBuilder();
        Document doc = builder.build(in);
        Element root = doc.getRootElement();
        List list = root.getChildren();
        Iterator it = list.iterator();
        while (it.hasNext()) {
            Element e = (Element) it.next();
            String k = e.getName();
            String v = "";
            List children = e.getChildren();
            if (children.isEmpty()) {
                v = e.getTextNormalize();
            } else {
                v = getChildrenText(children);
            }
            m.put(k, v);
        }
        //关闭流
        in.close();
        return m;
    }

    public static InputStream String2Inputstream(String str) {
        return new ByteArrayInputStream(str.getBytes());
    }

    /**
     * 获取子结点的xml
     *
     * @param children
     * @return String
     */
    public static String getChildrenText(List children) {
        StringBuffer sb = new StringBuffer();
        if (!children.isEmpty()) {
            Iterator it = children.iterator();
            while (it.hasNext()) {
                Element e = (Element) it.next();
                String name = e.getName();
                String value = e.getTextNormalize();
                List list = e.getChildren();
                sb.append("<" + name + ">");
                if (!list.isEmpty()) {
                    sb.append(getChildrenText(list));
                }
                sb.append(value);
                sb.append("</" + name + ">");
            }
        }
        return sb.toString();
    }
}

小程序前端实现

pay: function() {
    var that = this;
    var iMode = that.data.way;
    var orderid = that.data.orderid;
    app.request("/indent/payIndent", {
      id: orderid,
      iMode: iMode
    }, function(res) {
      if (iMode == 0) {
        wx.requestPayment({
          'timeStamp': res.data.timeStamp,
          'nonceStr': res.data.nonceStr,
          'package': res.data.package,
          'signType': res.data.signType,
          'paySign': res.data.paySign,
          'success': function(res) {
            wx.redirectTo({
              url: ''
            })
          },
          'fail': function(res) {
            wx.redirectTo({
              url: ''
            })
          }
        })
      }
    })
  },
发布了35 篇原创文章 · 获赞 27 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43948057/article/details/100697582