實戰:第八章:支付寶Native,JSAPI支付與微信Native,JSAPI,MWEB支付實現

首先是H5的支付,先看控制層的代碼

    @Autowired
    AliPayH5Bean aliPayH5Bean;

    @Autowired
    WxPayH5MWEB wxPayH5MWEB;

    @Autowired
    WxPayH5JSAPI wxPayH5JSAPI;

    @LoginRequired(isNeedLogin = true)
    @ApiOperation("H5去支付,支付主接口,用於控制支付流程")
    @GetMapping(value = "/h5/pay" ,produces = { "application/json;charset=UTF-8" })
    @ResponseBody
    public Object wxPrepay(String orderSn,BigDecimal totalAmount,String code,String channelId){
        //正常開發情況下是根據用戶登錄的id和訂單編號查詢該訂單是否爲登錄用戶的訂單並獲取訂單信息,訂單價格是不會作爲參數傳入的,這裏只是演示支付不做那麼麻煩
        String result = "";
        if(PayConstant.CHANNELALIH5.equals(channelId)){
            Map<String, Object> wxMap = aliPayH5Bean.getPayMap();
            wxMap.put("out_trade_no", orderSn);
            wxMap.put("total_fee", "1".equals(aliPayH5Bean.getPayMap().get("is_real_pay")) ? totalAmount : 0.01);
            //手機網站支付,調用支付寶(網頁類支付接口),這裏沒有寫(系統調用類支付接口)
            result = PayUtils.alipayh5(wxMap);
            if (StringUtils.isEmpty(result)) {
                throw new AppException("憑證生成失敗!");
            }
            return result;
        }else if(PayConstant.CHANNELWXMWEB.equals(channelId)){
            Map<String, Object> wxMap = wxPayH5MWEB.getPayMap();
            wxMap.put("out_trade_no", orderSn);
            wxMap.put("total_fee", "1".equals(wxPayH5MWEB.getPayMap().get("is_real_pay")) ? MoneyUtil.convertYuanToFen(String.valueOf(totalAmount)): 1);
            //MWEB支付是微信之外的瀏覽器,訪問手機網站時使用的支付手段
            Map<String, String> map = PayUtils.wxh5MWEBPay(wxMap);
            if (map == null) {
                throw new AppException("支付憑證生成失敗!");
            }
            return map;
        }else if(PayConstant.CHANNELWXJSAPI.equals(channelId)){
            Map<String, Object> wxMap = wxPayH5JSAPI.getPayMap();
            wxMap.put("out_trade_no", orderSn);
            wxMap.put("total_fee", "1".equals(wxPayH5MWEB.getPayMap().get("is_real_pay")) ? MoneyUtil.convertYuanToFen(String.valueOf(totalAmount)): 1);
            //JSAPI支付需要微信授權,前端引導用戶到指定頁面獲取到微信給code,code五分鐘內只能用一次,
            // 後端根據code獲取openid,微信公衆平臺配置時需要配置支付目錄與授權目錄要注意域名是否與後臺配置一致
            String openId = PayUtils.getOpenId(code, wxMap);
            wxMap.put("openId",openId);
            Map<String, String> map = PayUtils.wxJSAPIPay(wxMap);
            if (map == null) {
                throw new AppException("支付憑證生成失敗!");
            }
            return map;
        }
        return null;
    }

以上三種支付方式都是需要和前端交互的網頁類支付接口

然後看看H5的配置類:
 

    @Configuration
    @PropertySource("classpath:H5Pay.properties")
    public class H5PayConfig {
        //是否真實支付
        @Value("${is_real_pay}")
        private String is_real_pay;
        //支付寶H5
        @Value("${alipay_h5_app_id}")
        private String alipay_h5_app_id;
        @Value("${alipay_h5_private_key}")
        private String alipay_h5_private_key;
        @Value("${alipay_h5_public_key}")
        private String alipay_h5_public_key;
        @Value("${alipay_h5_notify_url}")
        private String alipay_h5_notify_url;
        @Value("${aplipay_h5_return_url}")
        private String aplipay_h5_return_url;
        //微信H5
        @Value("${wx_h5_appid}")
        private String wx_h5_appid;
        @Value("${wx_h5_appsecret}")
        private String wx_h5_appsecret;
        @Value("${wx_h5_partnerkey}")
        private String wx_h5_partnerkey;
        @Value("${wx_h5_mch_id}")
        private String wx_h5_mch_id;
        //微信H5交易類型是trade_type=MWEB
        @Value("${wx_mweb_notify_url}")
        private String wx_mweb_notify_url;
        @Value("${wx_mweb_return_url_h5}")
        private String wx_mweb_return_url_h5;
        //微信H5交易類型是trade_type=JSAPI
        @Value("${wx_jsapi_notify_url}")
        private String wx_jsapi_notify_url;
        @Value("${wx_jsapi_return_url_h5}")
        private String wx_jsapi_return_url_h5;
        /**
         * 微信H5支付,微信瀏覽器
         * @return
         */
        @Bean
        public WxPayH5JSAPI getWxPayH5JSAPI(){
            WxPayH5JSAPI wxPayH5JSAPI = new WxPayH5JSAPI();
            Map<String, String>  map = new HashMap<>();
            map.put("wx_h5_appid", wx_h5_appid);
            map.put("wx_h5_appsecret", wx_h5_appsecret);
            map.put("wx_h5_partnerkey", wx_h5_partnerkey);
            map.put("wx_h5_mch_id", wx_h5_mch_id);
            map.put("wx_jsapi_notify_url", wx_jsapi_notify_url);
            map.put("wx_jsapi_return_url_h5",wx_jsapi_return_url_h5);
            wxPayH5JSAPI.setPayMap(map);
            return wxPayH5JSAPI;
        }
    
        /**
         * 微信H5支付,非微信瀏覽器
         * @return
         */
        @Bean
        public WxPayH5MWEB getWxPayH5MWEB(){
            WxPayH5MWEB wxPayH5Bean = new WxPayH5MWEB();
            Map<String, String>  map = new HashMap<>();
            map.put("wx_h5_appid", wx_h5_appid);
            map.put("wx_h5_appsecret", wx_h5_appsecret);
            map.put("wx_h5_partnerkey", wx_h5_partnerkey);
            map.put("wx_h5_mch_id", wx_h5_mch_id);
            map.put("wx_mweb_notify_url", wx_mweb_notify_url);
            map.put("wx_mweb_return_url_h5",wx_mweb_return_url_h5);
            wxPayH5Bean.setPayMap(map);
            return wxPayH5Bean;
        }
    
        /**
         * 支付寶H5支付,非微信瀏覽器,微信不允許調用支付寶的支付接口
         * @return
         */
        @Bean
        public AliPayH5Bean getAlipayH5Info(){
            AliPayH5Bean payBean = new AliPayH5Bean();
            Map<String, String>  map = new HashMap<>();
            map.put("alipay_app_id", alipay_h5_app_id);
            map.put("alipay_private_key", alipay_h5_private_key);
            map.put("alipay_public_key", alipay_h5_public_key);
            map.put("notify_url", alipay_h5_notify_url);
            map.put("return_url", aplipay_h5_return_url);
            map.put("is_real_pay", is_real_pay);
            payBean.setPayMap(map);
            return payBean;
        }
    }

然後看看自定義實體類:

    public class AliPayH5Bean {

        private Map payMap;
    
        public Map getPayMap() {
            return payMap;
        }
    
        public void setPayMap(Map payMap) {
            this.payMap = payMap;
        }
    }

    public class WxPayH5MWEB {
    
        private Map payMap;
    
        public Map getPayMap() {
            return payMap;
        }
    
        public void setPayMap(Map payMap) {
            this.payMap = payMap;
        }
    }

    public class WxPayH5JSAPI {
    
        private Map payMap;
    
        public Map getPayMap() {
            return payMap;
        }
    
        public void setPayMap(Map payMap) {
            this.payMap = payMap;
        }
    }

然後是pc掃碼的支付:

    @Autowired
    WxClient wxClient;

    @LoginRequired(isNeedLogin = true)
    @ApiOperation("pc端去支付,支付主接口,用於控制整體支付流程")
    @RequestMapping(value = "/alipay/submit", method = RequestMethod.GET)
    @ResponseBody
    public String goToPay(String orderSn, BigDecimal totalAmount, Integer channelId) {
        //根據訂單創建支付信息並保存,這裏真實開發不會使用金額傳參,容易被篡改價格,但是爲了方便暫時先這樣寫
        Map<String, String> requestMap = savePayInfo(orderSn, totalAmount);
        String form="";
        if(PayConstant.CHANNELALINATIVE.equals(channelId)){
            //阿里支付
            form = generateForm(requestMap, form);
        }else if (PayConstant.CHANNELWXNATIVE.equals(channelId)){
            //微信支付
            Map map = wxClient.getMap();
            map.put("out_trade_no",orderSn);
            map.put("total_fee",totalAmount);
            String code_url = PayUtils.wxPcPay(map);
            String fileName = TimeUtils.getCurrentTime("yyyyMMddHHmmss") + ".png";
            String img_path = String.valueOf(map.get("img_path"));
            //說明:商戶後臺系統先調用微信支付的統一下單接口,微信後臺系統返回鏈接參數code_url,
            // 商戶後臺系統將code_url值生成二維碼圖片,用戶使用微信客戶端掃碼後發起支付。
            // 注意:code_url有效期爲2小時,過期後掃碼不能再發起支付。
            //將code_url的值生成二維碼圖片上傳到七牛雲,這裏就不寫上傳七牛雲的代碼了,
            // img_path:保存二維碼的基礎全路徑+"/qrcode/"+fileName:保存二維碼的圖片名稱+code_url:保存到二維碼裏的內容
            form = img_path + "/qrcode/" + fileName;
        }else{
            //其他第三方支付(未接入)

        }
        //發送檢查支付結果的消息隊列(這裏只檢查了阿里的支付)
        payService.sendingPayMQ(orderSn,6,channelId);
        return form;
    }

    
    /**
     * 支付寶pc端掃碼支付沒有寫到工具類裏面了,支付寶生成表單
     * @param requestMap
     * @param form
     * @return
     */
    private String generateForm(Map<String, String> requestMap, String form) {
        //創建PC場景下單並支付請求對象
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();//創建API對應的request
        //設置同步返回地址,HTTP/HTTPS開頭字符串
        alipayRequest.setReturnUrl(PCPayConfig.alipay_pc_return_url);
        //支付寶服務器主動通知商戶服務器裏指定的頁面http/https路徑。
        alipayRequest.setNotifyUrl(PCPayConfig.alipay_pc_notify_url);//在公共參數中設置回跳和通知地址
        //填充業務參數
        alipayRequest.setBizContent(JSON.toJSONString(requestMap));
        try {
            //調用SDK生成表單
            form = alipayClient.pageExecute(alipayRequest).getBody();
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return form;
    }

看看自定義的實體類:

public class WxClient {

    private Map map;

    public Map getMap() {
        return map;
    }

    public void setMap(Map map) {
        this.map = map;
    }
}

然後看看pc的配置類:

import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.javaliao.portal.bean.WxClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import java.util.HashMap;
import java.util.Map;

@Configuration
@PropertySource("classpath:PCPay.properties")
public class PCPayConfig {

    //阿里pc端
    @Value("${alipay_pc_url}")
    private String alipay_pc_url;
    @Value("${alipay_pc_public_key}")
    public static  String alipay_pc_public_key;
    @Value("${alipay_pc_private_key}")
    private String alipay_pc_private_key;
    @Value("${alipay_pc_app_id}")
    private String alipay_pc_app_id;
    @Value("${alipay_pc_notify_url}")
    public static String alipay_pc_notify_url;
    @Value("${alipay_pc_return_url}")
    public static  String alipay_pc_return_url;
    //微信pc端
    @Value("${wx_pc_appid}")
    public static String wx_pc_appid;
    @Value("${wx_pc_url}")
    public static String wx_pc_url;
    @Value("${wx_pc_appsecret}")
    public static String wx_pc_appsecret;
    @Value("${wx_pc_partnerkey}")
    public static String wx_pc_partnerkey;
    @Value("${wx_pc_mch_id}")
    public static String wx_pc_mch_id;
    @Value("${wx_pc_notify_url}")
    public static String wx_pc_notify_url;
    @Value("${img_path}")
    public static String img_path;
    public final static String format="json";
    public final static String charset="utf-8";
    public final static String sign_type="RSA2";

    @Bean
    public WxClient wxClient(){
        WxClient wxClient = new WxClient();
        Map<String , Object> map = new HashMap<>();
        map.put("wx_pc_appid",wx_pc_appid);
        map.put("wx_pc_appsecret",wx_pc_appsecret);
        map.put("wx_pc_partnerkey",wx_pc_partnerkey);
        map.put("wx_pc_mch_id",wx_pc_mch_id);
        map.put("wx_pc_notify_url",wx_pc_notify_url);
        map.put("wx_pc_url",wx_pc_url);
        map.put("img_path",img_path);
        wxClient.setMap(map);
        return wxClient;
    }

    /**
     * pc端支付寶支付Native
     * @return
     */
    @Bean
    public AlipayClient alipayClient(){
        return new DefaultAlipayClient(alipay_pc_url,alipay_pc_app_id,alipay_pc_private_key,format,charset,alipay_pc_public_key,sign_type);
    }


}

支付的工具類:

    package com.javaliao.portal.util;
    import com.alibaba.fastjson.JSON;
    import com.alipay.api.AlipayApiException;
    import com.alipay.api.AlipayClient;
    import com.alipay.api.DefaultAlipayClient;
    import com.alipay.api.domain.AlipayTradeAppPayModel;
    import com.alipay.api.domain.AlipayTradeWapPayModel;
    import com.alipay.api.internal.util.AlipaySignature;
    import com.alipay.api.request.*;
    import com.alipay.api.response.AlipayTradeAppPayResponse;
    import com.alipay.api.response.AlipayTradeRefundResponse;
    import com.javaliao.portal.bean.WXPubBean;
    import com.javaliao.portal.log4j.BaseLogger;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
    import org.apache.http.conn.ssl.SSLContexts;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
    import org.w3c.dom.Document;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    import javax.net.ssl.SSLContext;
    import javax.xml.parsers.DocumentBuilder;
    import java.io.ByteArrayInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.net.URLEncoder;
    import java.security.KeyStore;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.SortedMap;
    import java.util.TreeMap;
    
    public class PayUtils {

        /**
         * 支付寶H5支付
         * @param map
         * @return
         */
        public static String alipayh5(Map<String, Object> map) {
            AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",map.get("alipay_app_id").toString(), map.get("alipay_private_key").toString(), "json", "utf-8", map.get("alipay_public_key").toString(),"RSA2");
            AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
            model.setOutTradeNo(map.get("out_trade_no").toString());
            model.setSubject("委託檢測服務");
            model.setTotalAmount(map.get("total_fee").toString());
            model.setBody("委託檢測服務");
            model.setTimeoutExpress("2m");
            model.setProductCode("FAST_INSTANT_TRADE_PAY");
            // 創建手機網站API對應的request:AlipayTradeWapPayRequest;pc端的是AlipayTradePagePayRequest
            AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
            alipayRequest.setReturnUrl(map.get("return_url").toString());
            alipayRequest.setNotifyUrl(map.get("notify_url").toString());
            alipayRequest.setBizModel(model);
            // 調用SDK生成表單
            String form = null;
            try {
                form = alipayClient.pageExecute(alipayRequest).getBody();
                BaseLogger.info("支付寶支付生成同步響應報文: " + form);
                /*直接將完整的表單html輸出到頁面。說明:手機網站支付alipay.trade.wap.pay:
                對於頁面跳轉類API,SDK不會也無法像系統調用類API一樣自動請求支付寶並獲得結果,
                 而是在接受request請求對象後,爲開發者生成前臺頁面請求需要的完整form表單的html(包含自動提交腳本),
                 商戶直接將這個表單的String輸出到http response中即可。*/
                return form;
            } catch (AlipayApiException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        /**
         * 微信JSAPI支付
         * @param map
         * @return
         */
        public static Map<String, String> wxJSAPIPay(Map<String, Object> map) {
            SortedMap<String, String> paraMap = new TreeMap<String, String>();
            String random = NumberUtils.createRandom(false, 32);
            paraMap.put("appid", String.valueOf(map.get("wx_h5_appid")));// "wxe5703c4e06a09cc8";
            paraMap.put("attach", StringUtils.isNull(String.valueOf(map.get("attach"))) ? "商品購買" : map.get("attach") + "");
            paraMap.put("body", StringUtils.isNull(String.valueOf(map.get("body"))) ? "商品購買" : map.get("body") + "");
            paraMap.put("mch_id", String.valueOf(map.get("wx_h5_mch_id")));
            paraMap.put("nonce_str", random);
            paraMap.put("openid", String.valueOf(map.get("openId")));
            paraMap.put("out_trade_no", String.valueOf(map.get("out_trade_no")));
            paraMap.put("spbill_create_ip", "172.168.0.1");//終端ip,在APP和網頁支付提交用戶端ip,Native支付填調用微信支付API的機器IP。
            paraMap.put("total_fee", String.valueOf(map.get("total_fee")));
            paraMap.put("trade_type", "JSAPI");
            paraMap.put("notify_url", map.get("wx_jsapi_notify_url") + "");
            paraMap.put("sign_type", "MD5");
            // 簽名
            RequestHandler reqHandler = new RequestHandler(null, null);
            reqHandler.init(String.valueOf(map.get("wx_h5_appid")), String.valueOf(map.get("wx_h5_appsecret")),
                    String.valueOf(map.get("wx_h5_partnerkey")));
            paraMap.put("sign", reqHandler.createSign(paraMap));
            // 統一下單
            String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
            String xml = WXUtils.ArrayToXml(paraMap);
            String prepay_id = "";
            try {
                // 提交
                prepay_id = getPayPubNo(url, xml);
                if (prepay_id.equals("")) {
                    return null;
                }
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println(e.getMessage());
                return null;
            }
            SortedMap<String, String> packageParams = new TreeMap<String, String>();
            // 需要再次簽名,這裏要加上時間戳
            String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
            String prepay_id2 = "prepay_id=" + prepay_id;
            String packages = prepay_id2;
            packageParams.put("appId", String.valueOf(map.get("wx_h5_appid")));
            packageParams.put("timeStamp", timestamp);
            packageParams.put("nonceStr", random);
            packageParams.put("package", packages);
            packageParams.put("signType", "MD5");
            String finalsign = reqHandler.createSign(packageParams);
            packageParams.put("paySign", finalsign);
            return packageParams;
        }
    
        /**
         * 根據code獲取微信openid
         * @param code
         * @param map
         * @return
         */
        public static String getOpenId(String code,Map<String, Object> map)  {
            WXPubBean wxUserInfo = WXUtils.getWXUserInfo((String) map.get("wx_pub_appid"), (String) map.get("wx_pub_appsecret"), code);
            BaseLogger.info("獲取微信用戶授權信息:"+wxUserInfo.toString());
            if(wxUserInfo != null){
                return wxUserInfo.getOpenid();
            }
            return null;
        }
    
        /**
         * 提交url給微信獲取響應信息
         * @param url
         * @param xml
         * @return
         */
        private static String getPayPubNo(String url, String xml) {
            String prepay_id = "";
            try {
                String result = HttpUtils.getDataByJson(url, xml);
                if (result.indexOf("FAIL") != -1) {
                    return prepay_id;
                }
                Document document = XmlUtils.getDocumentByXml(result);
                prepay_id = XmlUtils.getValueByTagName(document, "prepay_id");
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("------------------------------" + e.getMessage());
            }
            return prepay_id;
        }
    
        /**
         * 微信h5mweb支付
         * @param map
         * @return
         */
        public static Map<String, String> wxh5MWEBPay(Map<String, Object> map) {
            // 設置微信原生支付所需參數
            // 封裝
            SortedMap<String, String> paraMap = new TreeMap<String, String>();
            paraMap.put("appid", String.valueOf(map.get("wx_h5_appid")));
            paraMap.put("attach", StringUtils.isNull(map.get("attach") + "") ? "商品購買" : map.get("attach") + "");
            paraMap.put("body", StringUtils.isNull(map.get("body") + "") ? "商品購買" : map.get("body") + "");
            paraMap.put("mch_id", String.valueOf(map.get("wx_h5_mch_id")));
            paraMap.put("nonce_str", NumberUtils.createRandom(false, 32));
            paraMap.put("out_trade_no", String.valueOf(map.get("out_trade_no")));
            paraMap.put("spbill_create_ip", "172.168.0.1");
            paraMap.put("total_fee", String.valueOf(map.get("total_fee")));
            paraMap.put("trade_type", "MWEB");
            paraMap.put("notify_url", String.valueOf(map.get("wx_mweb_notify_url")));
            paraMap.put("sign_type", "MD5");
            // 簽名
            RequestHandler reqHandler = new RequestHandler(null, null);
            reqHandler.init(String.valueOf(map.get("wx_h5_appid")), String.valueOf(map.get("wx_h5_appsecret")), String.valueOf(map.get("wx_h5_partnerkey")));
            String sign = reqHandler.createSign(paraMap);
            paraMap.put("sign", sign);
            // 統一下單
            String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
            String xml = WXUtils.ArrayToXml(paraMap);
            String mweb_url = "";
            try {
                // 提交
                mweb_url = getPayNo(url, xml,map);
                if (mweb_url.equals("")) {
                    return null;
                }
            } catch (Exception e1) {
                e1.printStackTrace();
                return null;
            }
            SortedMap<String, String> packageParams = new TreeMap<String, String>();
            //直接將拼接好的url發給前端即可,後端的支付代碼就沒啥事了
            packageParams.put("mweb_url", mweb_url);
            return packageParams;
        }
    
        /**
         * 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>();
                DocumentBuilder documentBuilder = WXPayXmlUtil.newDocumentBuilder();
                InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8"));
                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) {}
                return data;
            } catch (Exception ex) {
                throw ex;
            }
        }
    
        /**
         * 微信Native支付
         * @param map
         * @return
         */
        public static String wxPcPay(Map<String, Object> map) {
            // 設置微信原生支付所需參數
            String nonce_str = NumberUtils.createRandom(false, 32);
            // 封裝
            SortedMap<String, String> paraMap = new TreeMap<String, String>();
            paraMap.put("appid",String.valueOf(map.get("wx_pc_appid")));
            paraMap.put("attach",StringUtils.isNull(map.get("attach") + "") ? "商品購買" : map.get("attach") + "");
            paraMap.put("body",StringUtils.isNull(map.get("body") + "") ? "商品購買" : map.get("body") + "");
            paraMap.put("mch_id",String.valueOf(map.get("wx_pc_mch_id")));
            paraMap.put("nonce_str",nonce_str);
            paraMap.put("out_trade_no",String.valueOf(map.get("out_trade_no")));
            paraMap.put("spbill_create_ip","172.168.0.1");//用戶點擊微信支付的瀏覽器的IP
            paraMap.put("total_fee",String.valueOf(map.get("total_fee")));
            paraMap.put("trade_type","NATIVE");//掃碼支付類型
            paraMap.put("notify_url",String.valueOf(map.get("wx_pc_notify_url")));
            paraMap.put("sign_type", "MD5");
            // 簽名
            RequestHandler reqHandler = new RequestHandler(null, null);
            reqHandler.init(String.valueOf(map.get("wx_pc_appid")), String.valueOf(map.get("wx_pc_appsecret")), String.valueOf(map.get("wx_pc_partnerkey")));
            String sign = reqHandler.createSign(paraMap);
            paraMap.put("sign", sign);
            // 統一下單
            String xml = WXUtils.ArrayToXml(paraMap);
            System.out.println(xml);
            String code_url = "";
            try {
                String result = HttpUtils.getDataByJson(String.valueOf(map.get("wx_pc_url")), xml);
                BaseLogger.info("微信支付生成同步響應報文:" + result);
                if (result.indexOf("FAIL") != -1) {
                    return null;
                }
                Document document = XmlUtils.getDocumentByXml(result);
                code_url = XmlUtils.getValueByTagName(document, "code_url");
                return code_url;
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("------------------------------" + e.getMessage());
            }
            return null;
        }
    
        public static String getPayNo(String url, String xmlParam,Map<String, Object> maps) {
            String prepay_id = "";
            try {
                String result = HttpUtils.getDataByJson(url, xmlParam);
                if (result.indexOf("FAIL") != -1) {
                    return prepay_id;
                }else if(result.indexOf("SUCCESS") != -1){
                    //以下內容是返回前端頁面的json數據
                    String mweb_url = "";//跳轉鏈接
                    Map<String, String> map = WXPayUtil.xmlToMap(result);
                    mweb_url =  map.get("mweb_url");
                    //支付完返回瀏覽器跳轉的地址,如跳到查看訂單頁面
                    String redirect_url = maps.get("wx_mweb_return_url_h5") +
                            "?payWay=1&orderId=" + maps.get("out_trade_no") + "";
                    String redirect_urlEncode =  URLEncoder.encode(redirect_url,"utf-8");//對上面地址urlencode
                    mweb_url = mweb_url + "&redirect_url=" + redirect_urlEncode;//拼接返回地址
                    return mweb_url;
                }
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("------------------------------" + e.getMessage());
            }
            return prepay_id;
        }

    }



其他工具類:微信的一些工具類可以去微信官方的demo裏面找都是現成的,阿里的也一樣。

這裏給上一個鏈接:https://www.cnblogs.com/javawxid/p/11852918.html

裏面是我做支付時踩到的一些坑以及解決方案

說實話代碼沒多少,坑特別多,難度也不是很高,但是需要細心看官方文檔。

如果還有什麼問題,可以關注我,或者私聊我

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章