This article shares relevant information about JSAPI payment + sending template messages for your reference. The specific content is as follows
1. Tools
See the tool category: WeChat Pay JAVA version of Native Payment
2. Public account settings
3. Code implementation
openId: openId is the unique indication between the user and the public account. The following classes involve generating tokens, closing order interface calls, obtaining configuration file information, and tool classes. There are specific code implementations in other articles.
package com.zhrd.bussinss.platform.controller.rest;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.security.KeyStore;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.net.ssl.SSLContext;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import net.sf.json.JSONObject;import org.apache.http.HttpEntity;import org.apache.http.client.methods.CloseableHttpResponse;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.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.SAXReader;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;import com.zhrd.bussinss.platform.bo.JsPay;import com.zhrd.bussinss.platform.bo.PayHist;import com.zhrd.bussinss.platform.constants.PayHistoryPayStatus;import com.zhrd.bussinss.platform.constants.PayHistoryPayType;import com.zhrd.bussinss.platform.service.GetWeiXinAccessTokenService;import com.zhrd.bussinss.platform.service.WeiXinPayService;import com.zhrd.bussinss.platform.utils.CloseWeiXinOrderUtils;import com.zhrd.bussinss.platform.utils.CustomizedPropertyPlaceholderConfigurer;import com.zhrd.bussinss.platform.weixinPayUtils.ClientCustomSSL;@RestController@RequestMapping("/rest/weiXinSendMessage")public class WeiXinSendMessageRESTFULController { @Autowired WeiXinPayService weiXinPayService; @Autowired GetWeiXinAccessTokenService getWeiXinAccessTokenService; private static long standardTime = 1662652800000L; /** * WeChat send message* @param request * @param response * @return */ @RequestMapping(value="/weiXinSend",method=RequestMethod.GET) @ResponseBody public Object weiXinSend(HttpServletRequest request,HttpServletResponse response,String orderNo,String openId){ System.out.println("====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== CustomizedPropertyPlaceholderConfigurer.getContextProperty("wx.cert").toString())); try { keyStore.load(instream, "See Email".toCharArray()); } finally { enterstream.close(); } // Trust own CA and all self-signed certs SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, "10061401".toCharArray()).build(); // Allow TLSv1 protocol only SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); CloseableHttpClient httpclient = HttpClients.custom() .setSSLSocketFactory(sslsf).build(); // HttpGet httpget = new // HttpGet("https://api.mch.weixin.qq.com/secapi/pay/refund"); //For details on getting token, see the article on getting token HttpPost httppost = new HttpPost( "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+getWeiXinAccessTokenService.accessToken()); PayHist ph = null; List<Map<String,Object>> td = weiXinPayService.getTrade(orderNo); Date dt = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String nonceStr = sdf.format(dt).toString(); Date now = new Date(); String tradePayNo = orderNo+String.format("%10d",standardTime - now.getTime()).substring(0, 10); System.out.println("Order label orderNo============================================================; System.out.println("10-bit random number==================="+String.format("%10d",standardTime - now.getTime()).substring(0, 10)); String price = Math.round(Float.valueOf(td.get(0).get("price").toString())*100)+""; Long timeExpireStrOld = dt.getTime(); //For details, please refer to the article about obtaining configuration file information. Long timeNew = Long.parseLong(CustomizedPropertyPlaceholderConfigurer.getContextProperty("weixin.send2finish.overtime").toString()); Long timeExpireNew = timeExpireStrOld+timeNew; Date dtTimeExpire = new Date(timeExpireNew); SimpleDateFormat dtSdf = new SimpleDateFormat("yyyyMMddHHmmss"); String timeExpire = dtSdf.format(dtTimeExpire).toString(); System.out.println("nonceStr=="+nonceStr); System.out.println("orderNo=="+orderNo); System.out.println("price=="+price); System.out.println("timeStart=="+nonceStr); System.out.println("timeExpire=="+timeExpire); JSONObject resultJsPay = (JSONObject) getJsPay(nonceStr, "Order", tradePayNo, price, nonceStr,timeExpire,openId); resultJsPay.getString("prepayId"); System.out.println("================222prepay_id222========================="+resultJsPay.getString("prepayId").toString()); List<Map<String,Map<String,String>>> data = new ArrayList<Map<String,Map<String,String>>>(); Map<String,Map<String,String>> firstparam = new HashMap<String, Map<String,String>>(); Map<String,String> valueParam = new HashMap<String, String>(); valueParam.put("value", td.get(0).get("buyerName")+"(Mr./Ms.) Order"); valueParam.put("color", "#173177"); Map<String,String> valueParam1 = new HashMap<String, String>(); valueParam1.put("value", orderNo); valueParam1.put("color", "#173177"); Map<String,String> valueParam2 = new HashMap<String, String>(); valueParam2.put("value", "Smart Community Love Fresh Order"); valueParam2.put("color", "#173177"); Map<String,String> valueParam3 = new HashMap<String, String>(); valueParam3.put("value", td.get(0).get("price")+"meta"); valueParam3.put("color", "#173177"); Map<String,String> valueParam4 = new HashMap<String, String>(); valueParam4.put("value", "wait for payment"); valueParam4.put("color", "#173177"); Map<String,String> valueParam5 = new HashMap<String, String>(); valueParam5.put("value", "click to pay"); valueParam5.put("color", "#173177"); firstparam.put("first", valueParam); firstparam.put("keyword1", valueParam1); firstparam.put("keyword2", valueParam2); firstparam.put("keyword3", valueParam3); firstparam.put("keyword4", valueParam4); firstparam.put("remark", valueParam5); data.add(firstparam); JsPay jp = new JsPay(); jp.setTouser(openId); jp.setTemplate_id("MieXd4-4uqRFMdjnvqMjH0egFYpm16r5DPDT6P9gPgg"); jp.setTopcolor("#173177"); jp.setUrl("http://link for public account settings/weixin_jspay/weixinJsPay/init.action?packageValue="+resultJsPay.getString("prepayId").toString()); jp.setData(data); JSONObject jsonObject = JSONObject.fromObject(jp); String str = new String(jsonObject.toString().getBytes("utf-8"), "iso8859-1"); // String xml = ClientCustomSSL.RefundNativePackage(weiXinRefundService.getTradePayNo(orderNo),nonceStr,totalFee,refundFee,nonceStr); try { System.out.println("data============================================================================================== ClientCustomSSL.RefundNativePackage(weiXinRefundService.getTradePayNo(orderNo),nonceStr,nonceStr); try { System.out.println("executing request" + httppost.getRequestLine()); CloseableHttpResponse responseEntry = httpclient.execute(httppost); try { HttpEntity entity = responseEntry.getEntity(); InputStream in = entity.getContent(); byte b[] = new byte[1024]; int len = 0; int temp=0; //All read contents are received using temp while((temp=in.read())!=-1){ //When the reading is not finished, continue to read b[len]=(byte)temp; len++; } in.close(); System.out.println(new String(b,0,len)); if (entity != null) { System.out.println("Response content length: " + entity.getContentLength()); System.out.println("==="+responseEntry.getEntity().toString()); JSONObject result = JSONObject.fromObject(new String(b,0,len)); if(result.getString("errmsg").equals("ok")){ ph = new PayHist(); ph.setTradePayUrl(""); ph.setPayTradeNo(orderNo); ph.setTradePayNo(tradePayNo); ph.setPayStatus(PayHistoryPayStatus.WECHAT_PAY_STATUS_WAIT); ph.setPayType(PayHistoryPayType.WECHAT_JS_PAY); List<PayHist> payHistList = weiXinPayService.getPayHist(orderNo,"wechat",""); if(payHistList == null || payHistList.size() == 0){ weiXinPayService.addPayHist(ph); }else{ //For details on closing orders, see the article on canceling orders. JSONObject strStatus = (JSONObject) CloseWeiXinOrderUtils.closeWeiXinOrder(payHistList.get(0).getTradePayNo()); if(strStatus.getString("status").equals("success")){ System.out.println(ph.getTradePayNo()); weiXinPayService.updatePayHist(ph); } } } return result; } EntityUtils.consume(entity); } finally { responseEntry.close(); } } finally { httpclient.close(); } return null; } catch(Exception e){ e.printStackTrace(); JSONObject result = new JSONObject(); result.put("status","error"); result.put("msg",e.getMessage()); return result; } } public static Object getJsPay(String nonceStr,String orderDescribe,String orderNo,String price,String timeStart,String timeExpire,String openId) { try{ KeyStore keyStore = KeyStore.getInstance("PKCS12"); FileInputStream Instream = new FileInputStream(new File( CustomizedPropertyPlaceholderConfigurer.getContextProperty("wx.cert").toString())); try { keyStore.load(instream, "10061401".toCharArray()); } finally { enterstream.close(); } // Trust own CA and all self-signed certs SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, "See Email".toCharArray()).build(); // Allow TLSv1 protocol only SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); CloseableHttpClient httpclient = HttpClients.custom() .setSSLSocketFactory(sslsf).build(); // HttpGet httpget = new // HttpGet("https://api.mch.weixin.qq.com/secapi/pay/refund"); HttpPost httppost = new HttpPost( "https://api.mch.weixin.qq.com/pay/unifiedorder"); String xml = ClientCustomSSL.CreateJsApiPackage(nonceStr,orderDescribe,orderNo,price,timeStart,timeExpire,openId); try { StringEntity se = new StringEntity(xml); httppost.setEntity(se); System.out.println("executing request" + httppost.getRequestLine()); CloseableHttpResponse responseEntry = httpclient.execute(httppost); try { HttpEntity entity = responseEntry.getEntity(); System.out.println("----------------------------------------"); System.out.println(responseEntry.getStatusLine()); if (entity != null) { System.out.println("Response content length: " + entity.getContentLength()); SAXReader saxReader = new SAXReader(); Document document = saxReader.read(entity.getContent()); Element rootElt = document.getRootElement(); Document documentXml =DocumentHelper.parseText(xml); Element rootEltXml = documentXml.getRootElement(); System.out.println("root node: " + rootElt.getName()); System.out.println("==="+rootElt.elementText("result_code")); System.out.println("==="+rootElt.elementText("return_msg")); String resultCode = rootElt.elementText("result_code"); JSONObject result = new JSONObject(); if(resultCode.equals("SUCCESS")){ System.out.println("=================prepay_id===================="+ rootElt.elementText("prepay_id")); result.put("prepayId", rootElt.elementText("prepay_id")); result.put("sign",rootEltXml.elementText("sign")); result.put("status","success"); result.put("msg","success"); }else{ result.put("status","false"); result.put("msg",rootElt.elementText("err_code_des")); } return result; } EntityUtils.consume(entity); } finally { responseEntry.close(); } } finally { httpclient.close(); } return null; } catch(Exception e){ e.printStackTrace(); JSONObject result = new JSONObject(); result.put("status","error"); result.put("msg",e.getMessage()); return result; } } } 4. The code implementation control layer code in the weixin_jspay project
package com.weixin.jspay.controller;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;@Controller@RequestMapping("/weixinJsPay")public class WeiXinJsPayController { @RequestMapping(value = "/init", method = RequestMethod.GET) public String init( HttpServletRequest request,HttpServletResponse response,String packageValue,String paySign) { System.out.println("===================微信jsPay开始================="); System.out.println("packageValue==============="+packageValue); System.out.println("paySign====================="+paySign); request.setAttribute("packageValue", "prepay_id=" + packageValue); request.setAttribute("paySign", paySign); System.out.println("===================微信jsPay页面跳转开始================="); return "weixin"; } }
jsp code
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><script type="text/javascript" src="/weixin_jspay/js/md5.js"></script> <script language="javascript"> window.onload=function(){ var packageValue = '${packageValue}'; var paySign = '${paySign}'; alert("packageValue==========="+packageValue); alert("paySign==============="+paySign); var signString ="appId=See public account&nonceStr=random string&package="+packageValue+"&paySign="+paySign+"&signType=MD5&timeStamp=time"; //alert(signString); var md5SignValue= ("" + CryptoJS.MD5(signString)).toUpperCase(); //alert(md5SignValue); WeixinJSBridge.invoke('getBrandWCPayRequest',{ "appId" : "<span style="font-family: Arial, Helvetica, sans-serif;">See the public account</span>", "timeStamp" : "1395712654", "nonceStr" : "123456", "package" : packageValue, "signType" : "MD5", "paySign" : md5SignValue },function(res){ alert(res.err_msg); WeixinJSBridge.log(res.err_msg); if(res.err_msg == "get_brand_wcpay_request:ok"){ alert("WeChat payment successful"); }else if(res.err_msg == "get_brand_wcpay_request:cancel"){ alert("User cancellation payment"); }else{ alert("Pay failed"); } }) } </script> </head> <body> <button type="button" onclick="callpay('${packageValue}','${paySign}')" >WeChat jsPay</button> </body></html>WeChat Payment MD5.js:md5.js and WeChat Payment Development Document: Download Address
This article has been compiled into "Summary of JavaScript WeChat Development Skills", and everyone is welcome to learn and read.
I recommend a tutorial on WeChat applets that are highly concerned now: The editor of "WeChat Mini Program Development Tutorial" has carefully compiled it for everyone, I hope you like it.
The above is all the content of this article. I hope it will be helpful to everyone's learning and I hope everyone will support Wulin.com more.