如何使用java微信公众号支付示例详解

146 阅读11分钟

本文实例为大家分享了java微信公众号支付示例代码,供大家参考,具体内容如下

开始之前,先准备好:appid、商家号、商户密匙。

工具类:

MD5Util.java


`package` `com.yiexpress.core.utils.wechat;`

`import` `java.security.MessageDigest;`

`/**`

`* MD5工具类`

`*/`

`public` `class` `MD5Util {`

`public` `final` `static` `String MD5(String s) {`

`char` `hexDigits[]={``'0'``,``'1'``,``'2'``,``'3'``,``'4'``,``'5'``,``'6'``,``'7'``,``'8'``,``'9'``,``'A'``,``'B'``,``'C'``,``'D'``,``'E'``,``'F'``};`

`try` `{`

`byte``[] btInput = s.getBytes();`

`MessageDigest mdInst = MessageDigest.getInstance(``"MD5"``);`

`mdInst.update(btInput);`

`byte``[] md = mdInst.digest();`

`int` `j = md.length;`

`char` `str[] =` `new` `char``[j *` `2``];`

`int` `k =` `0``;`

`for` `(``int` `i =` `0``; i < j; i++) {`

`byte` `byte0 = md[i];`

`str[k++] = hexDigits[byte0 >>>` `4` `&` `0xf``];`

`str[k++] = hexDigits[byte0 &` `0xf``];`

`}`

`String md5Str =` `new` `String(str);`

`return` `md5Str;`

`}` `catch` `(Exception e) {`

`e.printStackTrace();`

`return` `null``;`

`}`

`}`

`}`

SapUtils.java

`package` `com.yiexpress.core.utils;`

`import` `java.lang.reflect.*;`

`import` `java.util.List;`

`import` `java.io.IOException;`

`import` `java.io.StringWriter;`

`import` `org.dom4j.Document;`

`import` `org.dom4j.DocumentHelper;`

`import` `org.dom4j.Element;`

`import` `org.dom4j.io.OutputFormat;`

`import` `org.dom4j.io.XMLWriter;`

`import` `org.slf4j.Logger;`

`import` `org.slf4j.LoggerFactory;`

`import` `org.springframework.util.StringUtils;`

`public` `class` `SapUtils {`

`private` `static` `final` `Logger logger = LoggerFactory.getLogger(SapUtils.``class``);`

`/** 根据反射对javabean转成xml文件的格式`

`* 以类名为第一标签,所有属性作为第二节点,并放入对应的值,如果属性为空 就不放入该熟悉`

`* @param dto 传入的对象`

`* @param operationName 操作名称`

`* @return`

`*/`

`public` `static` `String formatToXml(Object dto,String operationName){`

`logger.info(``"解析当前类{}为指定的xml文档格式的数据"``,dto.getClass().getName());`

`logger.info(``"当前的同步方法是,{}"``,operationName);`

`String result =` `null``;`

`Field fields[]=dto.getClass().getDeclaredFields();``//dto 是实体类名称`

`//DocumentHelper提供了创建Document对象的方法`

`Document document = DocumentHelper.createDocument();`

`//添加节点信息`

`String className=dto.getClass().getName();`

`// 操作的名称`

`Element rootElement = document.addElement(operationName);`

`try` `{`

`Field.setAccessible(fields,` `true``);`

`for` `(``int` `i =` `0``; i < fields.length; i++) {`

`//添加节点信息`

`if``(!StringUtils.isEmpty(fields[i].get(dto))){`

`Class<?> type = fields[i].getType();`

`// 如果是list`

`if``(type == List.``class``){`

`String listName = fields[i].getName();`

`createElement(rootElement, fields[i].get(dto),listName);`

`}`

`else``{`

`Element element = rootElement.addElement(fields[i].getName());`

`element.setText((String) fields[i].get(dto));`

`}`

`}`

`}`

`// 设置XML文档格式`

`OutputFormat outputFormat = OutputFormat.createPrettyPrint();`

`// 设置XML编码方式,即是用指定的编码方式保存XML文档到字符串(String),这里也可以指定为GBK或是ISO8859-1`

`outputFormat.setEncoding(``"UTF-8"``);`

`// outputFormat.setSuppressDeclaration(true); //是否生产xml头`

`outputFormat.setIndent(``true``);` `//设置是否缩进`

`outputFormat.setIndent(``"  "``);` `//以四个空格方式实现缩进`

`outputFormat.setNewlines(``true``);` `//设置是否换行`

`StringWriter stringWriter =``null``;`

`// Writer fileWriter =null;`

`// xmlWriter是用来把XML文档写入字符串的(工具)`

`XMLWriter xmlWriter =` `null``;`

`try` `{`

`// stringWriter字符串是用来保存XML文档的`

`stringWriter =` `new` `StringWriter();`

`// fileWriter = new FileWriter("D:\\modu11le.xml");`

`// xmlWriter是用来把XML文档写入字符串的(工具)`

`xmlWriter =` `new` `XMLWriter(stringWriter, outputFormat);`

`// 把创建好的XML文档写入字符串`

`xmlWriter.write(document);`

`//fileWriter.write(stringWriter.toString());`

`result=stringWriter.toString();`

`}` `catch` `(IOException e) {`

`logger.error(``"写入数据失败"``);`

`throw` `new` `RuntimeException(``"写入数据失败"``+e);`

`}``finally``{`

`try` `{`

`if``(xmlWriter!=``null``){`

`xmlWriter.flush();`

`xmlWriter.close();`

`}`

`/*           if(fileWriter!=null){`

`fileWriter.flush();`

`fileWriter.close();`

`}*/`

`} catch (IOException e) {`

`logger.error("关闭输出流出错");`

`throw new RuntimeException("关闭输出流出错"+e);`

`}`

`}`

`} catch (Exception e) {`

`logger.error("添加xml的节点失败"+e);`

`}`

`logger.error("转换xml结束");`

`return result;`

`}`

`/**`

`* 添加类中的list`

`* @param element`

`* @param object`

`* @param name`

`* @return`

`* @throws IllegalArgumentException`

`* @throws IllegalAccessException`

`*/`

`public` `static` `Element createElement(Element element ,Object object,String name )` `throws` `IllegalArgumentException, IllegalAccessException{`

`Element nameElement = element.addElement(name);`

`List info = (List)object;`

`for``(``int` `j=` `0``;j<info.size();j++){`

`// 添加row的标签`

`Element rowElement = nameElement.addElement(``"row"``);`

`// 添加 对象的熟悉`

`Field fields[]=info.get(j).getClass().getDeclaredFields();``//dto 是实体类名称`

`Field.setAccessible(fields,` `true``);`

`for` `(``int` `i =` `0``; i < fields.length; i++) {`

`//添加节点信息`

`if``(!StringUtils.isEmpty(fields[i].get(info.get(j)))){`

`Element childElement = rowElement.addElement(fields[i].getName());`

`childElement.setText((String) fields[i].get(info.get(j)));`

`}`

`}`

`}`

`return` `element;`

`}`

`}`

UnifiedOrderRequest.java


`package` `com.yiexpress.core.utils.wechat;`

`public` `class` `UnifiedOrderRequest {`

`private` `String appid;``// 公众账号ID`

`private` `String mch_id;``//商户号 `

`private` `String device_info;` `//设备号  否`

`private` `String nonce_str;``//随机字符串  `

`private` `String sign;``//签名  `

`private` `String sign_type;``//签名类型 `

`private` `String body;``//商品描述   `

`private` `String detail;``//商品详情 `

`private` `String attach;``//附加数据 `

`private` `String out_trade_no;``//商户订单号 `

`private` `String fee_type;``//标价币种  `

`private` `String total_fee;``//标价金额`

`private` `String spbill_create_ip;``//终端IP `

`private` `String time_start;``//交易起始时间 `

`private` `String time_expire;``//交易结束时间`

`private` `String goods_tag;``//订单优惠标记 `

`private` `String notify_url;``//通知地址  `

`private` `String trade_type;``//交易类型 `

`private` `String product_id;``//商品ID`

`private` `String limit_pay;``//指定支付方式`

`private` `String openid;``//用户标识 `

`public` `String getAppid() {`

`return` `appid;`

`}`

`public` `void` `setAppid(String appid) {`

`this``.appid = appid;`

`}`

`public` `String getMch_id() {`

`return` `mch_id;`

`}`

`public` `void` `setMch_id(String mch_id) {`

`this``.mch_id = mch_id;`

`}`

`public` `String getDevice_info() {`

`return` `device_info;`

`}`

`public` `void` `setDevice_info(String device_info) {`

`this``.device_info = device_info;`

`}`

`public` `String getNonce_str() {`

`return` `nonce_str;`

`}`

`public` `void` `setNonce_str(String nonce_str) {`

`this``.nonce_str = nonce_str;`

`}`

`public` `String getSign() {`

`return` `sign;`

`}`

`public` `void` `setSign(String sign) {`

`this``.sign = sign;`

`}`

`public` `String getSign_type() {`

`return` `sign_type;`

`}`

`public` `void` `setSign_type(String sign_type) {`

`this``.sign_type = sign_type;`

`}`

`public` `String getBody() {`

`return` `body;`

`}`

`public` `void` `setBody(String body) {`

`this``.body = body;`

`}`

`public` `String getDetail() {`

`return` `detail;`

`}`

`public` `void` `setDetail(String detail) {`

`this``.detail = detail;`

`}`

`public` `String getAttach() {`

`return` `attach;`

`}`

`public` `void` `setAttach(String attach) {`

`this``.attach = attach;`

`}`

`public` `String getOut_trade_no() {`

`return` `out_trade_no;`

`}`

`public` `void` `setOut_trade_no(String out_trade_no) {`

`this``.out_trade_no = out_trade_no;`

`}`

`public` `String getFee_type() {`

`return` `fee_type;`

`}`

`public` `void` `setFee_type(String fee_type) {`

`this``.fee_type = fee_type;`

`}`

`public` `String getTotal_fee() {`

`return` `total_fee;`

`}`

`public` `void` `setTotal_fee(String total_fee) {`

`this``.total_fee = total_fee;`

`}`

`public` `String getSpbill_create_ip() {`

`return` `spbill_create_ip;`

`}`

`public` `void` `setSpbill_create_ip(String spbill_create_ip) {`

`this``.spbill_create_ip = spbill_create_ip;`

`}`

`public` `String getTime_start() {`

`return` `time_start;`

`}`

`public` `void` `setTime_start(String time_start) {`

`this``.time_start = time_start;`

`}`

`public` `String getTime_expire() {`

`return` `time_expire;`

`}`

`public` `void` `setTime_expire(String time_expire) {`

`this``.time_expire = time_expire;`

`}`

`public` `String getGoods_tag() {`

`return` `goods_tag;`

`}`

`public` `void` `setGoods_tag(String goods_tag) {`

`this``.goods_tag = goods_tag;`

`}`

`public` `String getNotify_url() {`

`return` `notify_url;`

`}`

`public` `void` `setNotify_url(String notify_url) {`

`this``.notify_url = notify_url;`

`}`

`public` `String getTrade_type() {`

`return` `trade_type;`

`}`

`public` `void` `setTrade_type(String trade_type) {`

`this``.trade_type = trade_type;`

`}`

`public` `String getProduct_id() {`

`return` `product_id;`

`}`

`public` `void` `setProduct_id(String product_id) {`

`this``.product_id = product_id;`

`}`

`public` `String getLimit_pay() {`

`return` `limit_pay;`

`}`

`public` `void` `setLimit_pay(String limit_pay) {`

`this``.limit_pay = limit_pay;`

`}`

`public` `String getOpenid() {`

`return` `openid;`

`}`

`public` `void` `setOpenid(String openid) {`

`this``.openid = openid;`

`}`

`}`

UnifiedOrderRespose.java

`package` `com.yiexpress.core.utils.wechat;`

`public` `class` `UnifiedOrderRespose {`

`private` `String return_code;` `//返回状态码`

`private` `String return_msg;` `//返回信息`

`private` `String appid;` `//公众账号ID`

`private` `String mch_id;` `//商户号`

`private` `String device_info;` `//设备号`

`private` `String nonce_str;` `//随机字符串`

`private` `String sign;` `//签名`

`private` `String result_code;` `//业务结果`

`private` `String err_code;` `//错误代码`

`private` `String err_code_des;` `//错误代码描述`

`private` `String trade_type;` `//交易类型`

`private` `String prepay_id;` `//预支付交易会话标识`

`private` `String code_url;` `//二维码链接`

`public` `String getReturn_code() {`

`return` `return_code;`

`}`

`public` `void` `setReturn_code(String return_code) {`

`this``.return_code = return_code;`

`}`

`public` `String getReturn_msg() {`

`return` `return_msg;`

`}`

`public` `void` `setReturn_msg(String return_msg) {`

`this``.return_msg = return_msg;`

`}`

`public` `String getAppid() {`

`return` `appid;`

`}`

`public` `void` `setAppid(String appid) {`

`this``.appid = appid;`

`}`

`public` `String getMch_id() {`

`return` `mch_id;`

`}`

`public` `void` `setMch_id(String mch_id) {`

`this``.mch_id = mch_id;`

`}`

`public` `String getDevice_info() {`

`return` `device_info;`

`}`

`public` `void` `setDevice_info(String device_info) {`

`this``.device_info = device_info;`

`}`

`public` `String getNonce_str() {`

`return` `nonce_str;`

`}`

`public` `void` `setNonce_str(String nonce_str) {`

`this``.nonce_str = nonce_str;`

`}`

`public` `String getSign() {`

`return` `sign;`

`}`

`public` `void` `setSign(String sign) {`

`this``.sign = sign;`

`}`

`public` `String getResult_code() {`

`return` `result_code;`

`}`

`public` `void` `setResult_code(String result_code) {`

`this``.result_code = result_code;`

`}`

`public` `String getErr_code() {`

`return` `err_code;`

`}`

`public` `void` `setErr_code(String err_code) {`

`this``.err_code = err_code;`

`}`

`public` `String getErr_code_des() {`

`return` `err_code_des;`

`}`

`public` `void` `setErr_code_des(String err_code_des) {`

`this``.err_code_des = err_code_des;`

`}`

`public` `String getTrade_type() {`

`return` `trade_type;`

`}`

`public` `void` `setTrade_type(String trade_type) {`

`this``.trade_type = trade_type;`

`}`

`public` `String getPrepay_id() {`

`return` `prepay_id;`

`}`

`public` `void` `setPrepay_id(String prepay_id) {`

`this``.prepay_id = prepay_id;`

`}`

`public` `String getCode_url() {`

`return` `code_url;`

`}`

`public` `void` `setCode_url(String code_url) {`

`this``.code_url = code_url;`

`}`

`}`

WXPayConstants.java


`package` `com.yiexpress.core.utils.wechat;`

`public` `class` `WXPayConstants {`

`public` `enum` `SignType {`

`MD5, HMACSHA256`

`}`

`public` `static` `final` `String FAIL   =` `"FAIL"``;`

`public` `static` `final` `String SUCCESS =` `"SUCCESS"``;`

`public` `static` `final` `String HMACSHA256 =` `"HMAC-SHA256"``;`

`public` `static` `final` `String MD5 =` `"MD5"``;`

`public` `static` `final` `String FIELD_SIGN =` `"sign"``;`

`public` `static` `final` `String FIELD_SIGN_TYPE =` `"sign_type"``;`

`}`

WXPayUtil.java


`package` `com.yiexpress.core.utils.wechat;`

`import` `java.io.BufferedOutputStream;`

`import` `java.io.BufferedReader;`

`import` `java.io.ByteArrayInputStream;`

`import` `java.io.InputStream;`

`import` `java.io.InputStreamReader;`

`import` `java.io.StringWriter;`

`import` `java.io.Writer;`

`import` `java.net.HttpURLConnection;`

`import` `java.net.URL;`

`import` `java.util.*;`

`import` `java.security.MessageDigest;`

`import` `org.w3c.dom.Node;`

`import` `org.w3c.dom.NodeList;`

`import` `com.yiexpress.core.utils.SapUtils;`

`import` `com.yiexpress.core.utils.XmlUtil;`

`import` `com.yiexpress.core.utils.wechat.WXPayConstants.SignType;`

`import` `javax.crypto.Mac;`

`import` `javax.crypto.spec.SecretKeySpec;`

`import` `javax.xml.parsers.DocumentBuilder;`

`import` `javax.xml.parsers.DocumentBuilderFactory;`

`import` `javax.xml.transform.OutputKeys;`

`import` `javax.xml.transform.Transformer;`

`import` `javax.xml.transform.TransformerFactory;`

`import` `javax.xml.transform.dom.DOMSource;`

`import` `javax.xml.transform.stream.StreamResult;`

`import` `org.jdom2.Document;`

`import` `org.jdom2.Element;`

`import` `org.jdom2.input.SAXBuilder;`

`import` `org.slf4j.Logger;`

`import` `org.slf4j.LoggerFactory;`

`/**`

`* 支付工具类`

`*/`

`public` `class` `WXPayUtil {`

`private` `static` `Logger log = LoggerFactory.getLogger(WXPayUtil.``class``);`

`/**`

`* 生成订单对象信息`

`* @param orderId 订单号`

`* @param appId 微信appId`

`* @param mch_id 微信分配的商户ID`

`* @param body 支付介绍主体`

`* @param price 支付价格(放大100倍)`

`* @param spbill_create_ip 终端IP`

`* @param notify_url 异步直接结果通知接口地址`

`* @param noncestr`

`* @return`

`*/`

`public` `static` `Map<String,Object> createOrderInfo(Map<String, String> requestMap,String shopKey) { `

`//生成订单对象 `

`UnifiedOrderRequest unifiedOrderRequest =` `new` `UnifiedOrderRequest(); `

`unifiedOrderRequest.setAppid(requestMap.get(``"appId"``));``//公众账号ID `

`unifiedOrderRequest.setBody(requestMap.get(``"body"``));``//商品描述 `

`unifiedOrderRequest.setMch_id(requestMap.get(``"mch_id"``));``//商户号 `

`unifiedOrderRequest.setNonce_str(requestMap.get(``"noncestr"``));``//随机字符串  `

`unifiedOrderRequest.setNotify_url(requestMap.get(``"notify_url"``));``//通知地址 `

`unifiedOrderRequest.setOpenid(requestMap.get(``"userWeixinOpenId"``));`

`unifiedOrderRequest.setDetail(requestMap.get(``"detail"``));``//详情`

`unifiedOrderRequest.setOut_trade_no(requestMap.get(``"out_trade_no"``));``//商户订单号 `

`unifiedOrderRequest.setSpbill_create_ip(requestMap.get(``"spbill_create_ip"``));``//终端IP `

`unifiedOrderRequest.setTotal_fee(requestMap.get(``"payMoney"``));` `//金额需要扩大100倍:1代表支付时是0.01 `

`unifiedOrderRequest.setTrade_type(``"JSAPI"``);``//JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付`

`SortedMap<String, String> packageParams =` `new` `TreeMap<String, String>(); `

`packageParams.put(``"appid"``, unifiedOrderRequest.getAppid()); `

`packageParams.put(``"body"``, unifiedOrderRequest.getBody()); `

`packageParams.put(``"mch_id"``, unifiedOrderRequest.getMch_id()); `

`packageParams.put(``"nonce_str"``, unifiedOrderRequest.getNonce_str()); `

`packageParams.put(``"notify_url"``, unifiedOrderRequest.getNotify_url());`

`packageParams.put(``"openid"``, unifiedOrderRequest.getOpenid());`

`packageParams.put(``"detail"``, unifiedOrderRequest.getDetail());`

`packageParams.put(``"out_trade_no"``, unifiedOrderRequest.getOut_trade_no()); `

`packageParams.put(``"spbill_create_ip"``, unifiedOrderRequest.getSpbill_create_ip()); `

`packageParams.put(``"total_fee"``, unifiedOrderRequest.getTotal_fee()); `

`packageParams.put(``"trade_type"``, unifiedOrderRequest.getTrade_type());`

`try` `{`

`unifiedOrderRequest.setSign(generateSignature(packageParams,shopKey));``//签名`

`}` `catch` `(Exception e) {`

`e.printStackTrace();`

`}`

`//将订单对象转为xml格式 `

`String orderstr=SapUtils.formatToXml(unifiedOrderRequest,``"xml"``).replace(``"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"``,``""``);`

`log.debug(``"封装好的统一下单请求数据:"``+orderstr.replace(``"__"``,` `"_"``));`

`Map<String,Object> responseMap =` `new` `HashMap<String,Object>();`

`responseMap.put(``"orderInfo_toString"``, orderstr.replace(``"__"``,` `"_"``));`

`responseMap.put(``"unifiedOrderRequest"``,unifiedOrderRequest);`

`return` `responseMap; `

`} `

`public` `static` `void` `main(String[] args) {`

`//     UnifiedOrderRequest ut=new UnifiedOrderRequest();`

`//     ut.setAppid("wx1234156789");`

`//     ut.setBody("内容body");`

`//     ut.setMch_id("商户号");`

`//     ut.setNonce_str("随机字符串");`

`//     ut.setNotify_url("回调地址");`

`//     ut.setOpenid("openid");`

`//     ut.setDetail("详情");`

`//     ut.setOut_trade_no("订单号");`

`//     ut.setSpbill_create_ip("终端IP");`

`//     ut.setTotal_fee("金额");`

`//     ut.setTrade_type("调用类型JSAPI");`

`//     System.out.println("---"+SapUtils.formatToXml(ut,"xml")+"---");`

`//     UnifiedOrderRequest unifiedOrderRequest = new UnifiedOrderRequest(); `

`//     unifiedOrderRequest.setAppid("dsfsdf");//公众账号ID `

`//     unifiedOrderRequest.setBody("sdfsdf");//商品描述 `

`//     unifiedOrderRequest.setMch_id("sdfsd");//商户号 `

`//     unifiedOrderRequest.setNonce_str("dfsd");//随机字符串  `

`//     unifiedOrderRequest.setNotify_url("sdfdsf");//通知地址 `

`//     unifiedOrderRequest.setOpenid("sdfsdf");`

`//      `

`//     unifiedOrderRequest.setTrade_type("JSAPI");//JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付`

`//    `

`//     System.out.println("---"+SapUtils.formatToXml(unifiedOrderRequest,"xml").replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>","")+"---");`

`//     String str="<xml><appid>dsfsdf</appid><mch_id>sdfsd</mch_id><nonce_str>dfsd</nonce_str><body>sdfsdf</body><notify_url>sdfdsf</notify_url><trade_type>JSAPI</trade_type><openid>sdfsdf</openid></xml>";`

`//     UnifiedOrderRequest s=SapUtils.getBeanByxml(str,UnifiedOrderRequest.class);`

`//     System.out.println(s.getAppid()+"---"+s.getMch_id()+"--"+s.getFee_type());`

`}`

`/**`

`* 生成签名`

`* @param appid_value`

`* @param mch_id_value`

`* @param productId`

`* @param nonce_str_value`

`* @param trade_type `

`* @param notify_url `

`* @param spbill_create_ip `

`* @param total_fee `

`* @param out_trade_no `

`* @return`

`*/` 

`private` `static` `String createSign(UnifiedOrderRequest unifiedOrderRequest,String shopKey) { `

`//根据规则创建可排序的map集合 `

`SortedMap<String, String> packageParams =` `new` `TreeMap<String, String>(); `

`packageParams.put(``"appid"``, unifiedOrderRequest.getAppid()); `

`packageParams.put(``"body"``, unifiedOrderRequest.getBody()); `

`packageParams.put(``"mch_id"``, unifiedOrderRequest.getMch_id()); `

`packageParams.put(``"nonce_str"``, unifiedOrderRequest.getNonce_str()); `

`packageParams.put(``"notify_url"``, unifiedOrderRequest.getNotify_url()); `

`packageParams.put(``"out_trade_no"``, unifiedOrderRequest.getOut_trade_no()); `

`packageParams.put(``"spbill_create_ip"``, unifiedOrderRequest.getSpbill_create_ip()); `

`packageParams.put(``"trade_type"``, unifiedOrderRequest.getTrade_type()); `

`packageParams.put(``"total_fee"``, unifiedOrderRequest.getTotal_fee()); `

`StringBuffer sb =` `new` `StringBuffer(); `

`Set es = packageParams.entrySet();``//字典序 `

`Iterator it = es.iterator(); `

`while` `(it.hasNext()) { `

`Map.Entry entry = (Map.Entry) it.next(); `

`String k = (String) entry.getKey(); `

`String v = (String) entry.getValue(); `

`//为空不参与签名、参数名区分大小写 `

`if` `(``null` `!= v && !``""``.equals(v) && !``"sign"``.equals(k) && !``"key"``.equals(k)) { `

`sb.append(k +` `"="` `+ v +` `"&"``); `

`} `

`} `

`//第二步拼接key,key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 `

`sb.append(``"key="``+shopKey); `

`String sign = MD5Util.MD5(sb.toString()).toUpperCase();``//MD5加密 `

`log.error(``"方式一生成的签名="``+sign);`

`return` `sign; `

`} `

`//xml解析  `

`public` `static` `SortedMap<String, String> doXMLParseWithSorted(String strxml)` `throws` `Exception {  `

`strxml = strxml.replaceFirst(``"encoding=\".*\""``,` `"encoding=\"UTF-8\""``);  `

`if``(``null` `== strxml ||` `""``.equals(strxml)) {  `

`return` `null``;  `

`}  `

`SortedMap<String,String> m =` `new` `TreeMap<String,String>();   `

`InputStream in =` `new` `ByteArrayInputStream(strxml.getBytes(``"UTF-8"``));  `

`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` `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();  `

`} `

`/**`

`* 调统一下单API`

`* @param orderInfo`

`* @return`

`*/` 

`public` `static` `UnifiedOrderRespose httpOrder(String orderInfo,``int` `index) {`

`//统一下单接口地址 自动适应 1中国境内 2东南亚  3其他`

`String[] urlList={``"[https://api.mch.weixin.qq.com/pay/unifiedorder](https://api.mch.weixin.qq.com/pay/unifiedorder)"``,``"[https://apihk.mch.weixin.qq.com/pay/unifiedorder](https://apihk.mch.weixin.qq.com/pay/unifiedorder)"`

`,``"[https://apius.mch.weixin.qq.com/pay/unifiedorder](https://apius.mch.weixin.qq.com/pay/unifiedorder) "``};`

`//String url = "[https://api.mch.weixin.qq.com/pay/unifiedorder](https://api.mch.weixin.qq.com/pay/unifiedorder)"; `

`try` `{ `

`HttpURLConnection conn = (HttpURLConnection)` `new` `URL(urlList[index]).openConnection(); `

`//加入数据  `

`conn.setRequestMethod(``"POST"``);  `

`conn.setDoOutput(``true``);  `

`BufferedOutputStream buffOutStr =` `new` `BufferedOutputStream(conn.getOutputStream());  `

`buffOutStr.write(orderInfo.getBytes(``"UTF-8"``)); `

`buffOutStr.flush();  `

`buffOutStr.close();  `

`//获取输入流  `

`BufferedReader reader =` `new` `BufferedReader(``new` `InputStreamReader(conn.getInputStream(),` `"UTF-8"``));  `

`String line =` `null``;  `

`StringBuffer sb =` `new` `StringBuffer();  `

`while``((line = reader.readLine())!=` `null``){  `

`sb.append(line);  `

`} `

`//xml转对象`

`UnifiedOrderRespose unifiedOrderRespose =XmlUtil.getBeanByxml(sb.toString(),UnifiedOrderRespose.``class``); `

`return` `unifiedOrderRespose;`

`}` `catch` `(Exception e) { `

`e.printStackTrace(); `

`} `

`return` `null``; `

`}`

`/**`

`* 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) {`

`WXPayUtil.getLogger().warn(``"Invalid XML, can not convert to map. Error message: {}. XML content: {}"``, ex.getMessage(), strXML);`

`throw` `ex;`

`}`

`}`

`/**`

`* 将Map转换为XML格式的字符串`

`*`

`* @param data Map类型数据`

`* @return XML格式的字符串`

`* @throws Exception`

`*/`

`public` `static` `String mapToXml(Map<String, String> data)` `throws` `Exception {`

`DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();`

`DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder();`

`org.w3c.dom.Document document = documentBuilder.newDocument();`

`org.w3c.dom.Element root = document.createElement(``"xml"``);`

`document.appendChild(root);`

`for` `(String key: data.keySet()) {`

`String value = data.get(key);`

`if` `(value ==` `null``) {`

`value =` `""``;`

`}`

`value = value.trim();`

`org.w3c.dom.Element filed = document.createElement(key);`

`filed.appendChild(document.createTextNode(value));`

`root.appendChild(filed);`

`}`

`TransformerFactory tf = TransformerFactory.newInstance();`

`Transformer transformer = tf.newTransformer();`

`DOMSource source =` `new` `DOMSource(document);`

`transformer.setOutputProperty(OutputKeys.ENCODING,` `"UTF-8"``);`

`transformer.setOutputProperty(OutputKeys.INDENT,` `"yes"``);`

`StringWriter writer =` `new` `StringWriter();`

`StreamResult result =` `new` `StreamResult(writer);`

`transformer.transform(source, result);`

`String output = writer.getBuffer().toString();` `//.replaceAll("\n|\r", "");`

`try` `{`

`writer.close();`

`}`

`catch` `(Exception ex) {`

`}`

`return` `output;`

`}`

`/**`

`* 生成带有 sign 的 XML 格式字符串`

`*`

`* @param data Map类型数据`

`* @param key API密钥`

`* @return 含有sign字段的XML`

`*/`

`public` `static` `String generateSignedXml(``final` `Map<String, String> data, String key)` `throws` `Exception {`

`return` `generateSignedXml(data, key, SignType.MD5);`

`}`

`/**`

`* 生成带有 sign 的 XML 格式字符串`

`*`

`* @param data Map类型数据`

`* @param key API密钥`

`* @param signType 签名类型`

`* @return 含有sign字段的XML`

`*/`

`public` `static` `String generateSignedXml(``final` `Map<String, String> data, String key, SignType signType)` `throws` `Exception {`

`String sign = generateSignature(data, key, signType);`

`data.put(WXPayConstants.FIELD_SIGN, sign);`

`return` `mapToXml(data);`

`}`

`/**`

`* 判断签名是否正确`

`*`

`* @param xmlStr XML格式数据`

`* @param key API密钥`

`* @return 签名是否正确`

`* @throws Exception`

`*/`

`public` `static` `boolean` `isSignatureValid(String xmlStr, String key)` `throws` `Exception {`

`Map<String, String> data = xmlToMap(xmlStr);`

`if` `(!data.containsKey(WXPayConstants.FIELD_SIGN) ) {`

`return` `false``;`

`}`

`String sign = data.get(WXPayConstants.FIELD_SIGN);`

`return` `generateSignature(data, key).equals(sign);`

`}`

`/**`

`* 判断签名是否正确,必须包含sign字段,否则返回false。使用MD5签名。`

`*`

`* @param data Map类型数据`

`* @param key API密钥`

`* @return 签名是否正确`

`* @throws Exception`

`*/`

`public` `static` `boolean` `isSignatureValid(Map<String, String> data, String key)` `throws` `Exception {`

`return` `isSignatureValid(data, key, SignType.MD5);`

`}`

`/**`

`* 判断签名是否正确,必须包含sign字段,否则返回false。`

`*`

`* @param data Map类型数据`

`* @param key API密钥`

`* @param signType 签名方式`

`* @return 签名是否正确`

`* @throws Exception`

`*/`

`public` `static` `boolean` `isSignatureValid(Map<String, String> data, String key, SignType signType)` `throws` `Exception {`

`if` `(!data.containsKey(WXPayConstants.FIELD_SIGN) ) {`

`return` `false``;`

`}`

`String sign = data.get(WXPayConstants.FIELD_SIGN);`

`return` `generateSignature(data, key, signType).equals(sign);`

`}`

`/**`

`* 生成签名`

`*`

`* @param data 待签名数据`

`* @param key API密钥`

`* @return 签名`

`*/`

`public` `static` `String generateSignature(``final` `Map<String, String> data, String key)` `throws` `Exception {`

`return` `generateSignature(data, key, SignType.MD5);`

`}`

`/**`

`* 生成签名. 注意,若含有sign_type字段,必须和signType参数保持一致。`

`*`

`* @param data 待签名数据`

`* @param key API密钥`

`* @param signType 签名方式`

`* @return 签名`

`*/`

`public` `static` `String generateSignature(``final` `Map<String, String> data, String key, 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` `(SignType.MD5.equals(signType)) {`

`return` `MD5(sb.toString()).toUpperCase();`

`}`

`else` `if` `(SignType.HMACSHA256.equals(signType)) {`

`return` `HMACSHA256(sb.toString(), key);`

`}`

`else` `{`

`log.error(``"获取签名失败,失败原因:"``+String.format(``"Invalid sign_type: %s"``, signType));`

`throw` `new` `Exception(String.format(``"Invalid sign_type: %s"``, signType));`

`}`

`}`

`/**`

`* 获取随机字符串 Nonce Str`

`* @return String 随机字符串`

`*/`

`public` `static` `String generateNonceStr() {`

`return` `UUID.randomUUID().toString().replaceAll(``"-"``,` `""``).substring(``0``,` `32``);`

`}`

`/**`

`* Map转xml数据`

`*/` 

`public` `static` `String GetMapToXML(Map<String,String> param){ `

`StringBuffer sb =` `new` `StringBuffer(); `

`sb.append(``"<xml>"``); `

`for` `(Map.Entry<String,String> entry : param.entrySet()) {  `

`sb.append(``"<"``+ entry.getKey() +``">"``); `

`sb.append(entry.getValue()); `

`sb.append(``"</"``+ entry.getKey() +``">"``); `

`}  `

`sb.append(``"</xml>"``); `

`return` `sb.toString(); `

`} `

`/**`

`* 生成 MD5`

`* @param data 待处理数据`

`* @return MD5结果`

`*/`

`public` `static` `String MD5(String data)` `throws` `Exception {`

`java.security.MessageDigest md = MessageDigest.getInstance(``"MD5"``);`

`byte``[] array = md.digest(data.getBytes(``"UTF-8"``));`

`StringBuilder sb =` `new` `StringBuilder();`

`for` `(``byte` `item : array) {`

`sb.append(Integer.toHexString((item &` `0xFF``) |` `0x100``).substring(``1``,` `3``));`

`}`

`return` `sb.toString().toUpperCase();`

`}`

`/**`

`* 生成 HMACSHA256`

`* @param data 待处理数据`

`* @param key 密钥`

`* @return 加密结果`

`* @throws Exception`

`*/`

`public` `static` `String HMACSHA256(String data, String key)` `throws` `Exception {`

`Mac sha256_HMAC = Mac.getInstance(``"HmacSHA256"``);`

`SecretKeySpec secret_key =` `new` `SecretKeySpec(key.getBytes(``"UTF-8"``),` `"HmacSHA256"``);`

`sha256_HMAC.init(secret_key);`

`byte``[] array = sha256_HMAC.doFinal(data.getBytes(``"UTF-8"``));`

`StringBuilder sb =` `new` `StringBuilder();`

`for` `(``byte` `item : array) {`

`sb.append(Integer.toHexString((item &` `0xFF``) |` `0x100``).substring(``1``,` `3``));`

`}`

`return` `sb.toString().toUpperCase();`

`}`

`/**`

`* 日志`

`* @return`

`*/`

`public` `static` `Logger getLogger() {`

`Logger logger = LoggerFactory.getLogger(``"wxpay java sdk"``);`

`return` `logger;`

`}`

`/**`

`* 获取当前时间戳,单位秒`

`* @return`

`*/`

`public` `static` `long` `getCurrentTimestamp() {`

`return` `System.currentTimeMillis()/``1000``;`

`}`

`/**`

`* 获取当前时间戳,单位毫秒`

`* @return`

`*/`

`public` `static` `long` `getCurrentTimestampMs() {`

`return` `System.currentTimeMillis();`

`}`

`/**`

`* 生成 uuid, 即用来标识一笔单,也用做 nonce_str`

`* @return`

`*/`

`public` `static` `String generateUUID() {`

`return` `UUID.randomUUID().toString().replaceAll(``"-"``,` `""``).substring(``0``,` `32``);`

`}`

`/**`

`* 支付签名`

`* @param timestamp`

`* @param noncestr`

`* @param packages`

`* @return`

`* @throws UnsupportedEncodingException `

`*/` 

`public` `static` `String paySign(String timestamp, String noncestr,String packages,String appId){ `

`Map<String, String> paras =` `new` `HashMap<String, String>(); `

`paras.put(``"appid"``, appId); `

`paras.put(``"timestamp"``, timestamp); `

`paras.put(``"noncestr"``, noncestr); `

`paras.put(``"package"``, packages); `

`paras.put(``"signType"``,` `"MD5"``); `

`StringBuffer sb =` `new` `StringBuffer(); `

`Set es = paras.entrySet();``//字典序 `

`Iterator it = es.iterator(); `

`while` `(it.hasNext()) { `

`Map.Entry entry = (Map.Entry) it.next(); `

`String k = (String) entry.getKey(); `

`String v = (String) entry.getValue(); `

`//为空不参与签名、参数名区分大小写 `

`if` `(``null` `!= v && !``""``.equals(v) && !``"sign"``.equals(k) && !``"key"``.equals(k)) { `

`sb.append(k +` `"="` `+ v +` `"&"``); `

`} `

`} `

`String sign = MD5Util.MD5(sb.toString()).toUpperCase();``//MD5加密 `

`return` `sign; `

`} `

`}`

XmlUtil.java

`package` `com.yiexpress.core.utils;`

`import` `java.io.StringReader;`

`import` `java.lang.reflect.Field;`

`import` `java.util.Date;`

`import` `org.dom4j.Document;`

`import` `org.dom4j.Element;`

`import` `org.dom4j.io.SAXReader;`

`import` `org.xml.sax.InputSource;`

`public` `class` `XmlUtil{`

`/**`

`* json 数据转换对象`

`*`

`* @param Element`

`*      要转换的Element数据`

`* @param pojo`

`*      要转换的目标对象类型`

`* @return 转换的目标对象`

`* @throws Exception`

`*       转换失败`

`*/`

`@SuppressWarnings``(``"rawtypes"``)`

`public` `static` `Object fromXmlToBean(Element rootElt, Class pojo)` `throws` `Exception{`

`// 首先得到pojo所定义的字段`

`Field[] fields = pojo.getDeclaredFields();`

`// 根据传入的Class动态生成pojo对象`

`Object obj = pojo.newInstance();`

`for` `(Field field : fields)`

`{`

`// 设置字段可访问(必须,否则报错)`

`field.setAccessible(``true``);`

`// 得到字段的属性名`

`String name = field.getName();`

`// 这一段的作用是如果字段在Element中不存在会抛出异常,如果出异常,则跳过。`

`try`

`{`

`rootElt.elementTextTrim(name);`

`}`

`catch` `(Exception ex)`

`{`

`continue``;`

`}`

`if` `(rootElt.elementTextTrim(name) !=` `null` `&& !``""``.equals(rootElt.elementTextTrim(name)))`

`{`

`// 根据字段的类型将值转化为相应的类型,并设置到生成的对象中。`

`if` `(field.getType().equals(Long.``class``) || field.getType().equals(``long``.``class``))`

`{`

`field.set(obj, Long.parseLong(rootElt.elementTextTrim(name)));`

`}`

`else` `if` `(field.getType().equals(String.``class``))`

`{`

`field.set(obj, rootElt.elementTextTrim(name));`

`}`

`else` `if` `(field.getType().equals(Double.``class``) || field.getType().equals(``double``.``class``))`

`{`

`field.set(obj, Double.parseDouble(rootElt.elementTextTrim(name)));`

`}`

`else` `if` `(field.getType().equals(Integer.``class``) || field.getType().equals(``int``.``class``))`

`{`

`field.set(obj, Integer.parseInt(rootElt.elementTextTrim(name)));`

`}`

`else` `if` `(field.getType().equals(java.util.Date.``class``))`

`{`

`field.set(obj, Date.parse(rootElt.elementTextTrim(name)));`

`}`

`else`

`{`

`continue``;`

`}`

`}`

`}`

`return` `obj;`

`}`

`/**`

`* 把xml格式转化为指定对象`

`*`

`* @param xml`

`* @return`

`*/`

`@SuppressWarnings``(``"unchecked"``)`

`public` `static` `<T> T getBeanByxml(String xml, Class<T> valueType) {`

`T person =` `null``;`

`InputSource in =` `new` `InputSource(``new` `StringReader(xml));`

`in.setEncoding(``"UTF-8"``);`

`SAXReader reader =` `new` `SAXReader();`

`Document document;`

`try` `{`

`document = reader.read(in);`

`Element root = document.getRootElement();`

`person = (T) XmlUtil.fromXmlToBean(root, valueType);`

`}` `catch` `(Exception e) {`

`// TODO Auto-generated catch block`

`e.printStackTrace();`

`System.out.println(``"数据解析错误"``);`

`}`

`return` `person;`

`}`

`}`

获取预支付ID和签名的controller


`package` `com.yiexpress.jerry.controller.ewe.wechat;`

`import` `java.util.HashMap;`

`import` `java.util.Map;`

`import` `java.util.SortedMap;`

`import` `java.util.TreeMap;`

`import` `javax.servlet.http.HttpServletRequest;`

`import` `org.slf4j.Logger;`

`import` `org.slf4j.LoggerFactory;`

`import` `org.springframework.stereotype.Controller;`

`import` `org.springframework.web.bind.annotation.RequestMapping;`

`import` `org.springframework.web.bind.annotation.RequestParam;`

`import` `org.springframework.web.bind.annotation.ResponseBody;`

`import` `com.yiexpress.core.utils.wechat.UnifiedOrderRequest;`

`import` `com.yiexpress.core.utils.wechat.UnifiedOrderRespose;`

`import` `com.yiexpress.core.utils.wechat.WXPayUtil;`

`/**`

`* 微信支付controller`

`*/`

`@Controller`

`@RequestMapping``(value =` `"/wxpay"``)`

`public` `class` `WXPayController{`

`private` `static` `final` `Logger LOGGER = LoggerFactory.getLogger(WXPayController.``class``);`

`private` `String appId=``"公总号 appid"``;``//公总号 appid`

`private` `String mchId=``"商家号"``;``//商家号`

`private` `String apiKey=``"商户密匙"``;``//商户密匙`

`/**`

`* 获取终端IP`

`* @param request`

`* @return`

`*/`

`public` `static` `String getIpAddr(HttpServletRequest request) { `

`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(); `

`}  `

`return` `ip; `

`} `

`/**`

`* 支付初始化  返回预支付ID、签名等信息`

`* @param payMoney`

`* @return map`

`* result -1`

`*/`

`@RequestMapping``(``"/toPayInit"``)`

`@ResponseBody`

`public` `Map<String,Object> toPay(HttpServletRequest request,``@RequestParam``(value=``"payMoney"``,required=``true``)``float` `payMoney,``@RequestParam``(value=``"openId"``,required=``true``) String openId,``@RequestParam``(value=``"orderId"``,required=``true``)String orderId){`

`Map<String,Object> map =` `new` `HashMap<>();`

`//订单号 目前生产的随机数 后面放入指定系统唯一的单号`

`//判断单号是否存在`

`String noncestr = WXPayUtil.generateNonceStr();`

`Map<String,String> requestMap =` `new` `HashMap<String, String>();`

`requestMap.put(``"appId"``,appId);`

`requestMap.put(``"userWeixinOpenId"``,openId);`

`//之前使用ETCA单号作为商户订单号,现在改为自动生成的账单号  2018-10-25 Peter`

`//requestMap.put("out_trade_no",auShipmentBrief.getShipmentReference());`

`requestMap.put(``"out_trade_no"``,``"订单号"``);`

`requestMap.put(``"mch_id"``,mchId);`

`//计算金额  微信支付的金额的单位是分,例如:实际支付1.23元,传入参数就是123`

`int` `money=``0``;`

`try` `{`

`money=(``int``)(payMoney*``100``);`

`}` `catch` `(Exception e) {`

`map.put(``"result"``,-``1``);`

`map.put(``"msg"``,``"金额格式不正确"``);`

`return` `map;`

`}`

`requestMap.put(``"payMoney"``,money+``""``);`

`requestMap.put(``"spbill_create_ip"``, getIpAddr(request));`

`requestMap.put(``"notify_url"``,``"回调地址"``);`

`requestMap.put(``"noncestr"``, noncestr);`

`requestMap.put(``"body"``,``"微信下单账单支付"``);`

`requestMap.put(``"detail"``,``"散客下单账单支付"``);`

`Map<String,Object> requestInfo = WXPayUtil.createOrderInfo(requestMap,apiKey);`

`String orderInfo_toString = (String) requestInfo.get(``"orderInfo_toString"``);`

`LOGGER.debug(``"request 请求字符串:"``+orderInfo_toString);`

`//判断返回码   `

`UnifiedOrderRespose orderResponse = WXPayUtil.httpOrder(orderInfo_toString,``0``);``// 调用统一下单接口`

`//判断超时的情况`

`if``(orderResponse==``null` `|| orderResponse.getReturn_code()==``null` `|| (``"SUCCESS"``.equals(orderResponse.getReturn_code()) && (orderResponse.getErr_code()==``null` `||` `"SYSTEMERROR"``.equals(orderResponse.getErr_code())))){`

`orderResponse = WXPayUtil.httpOrder(orderInfo_toString,``1``);`

`if``(orderResponse==``null` `|| orderResponse.getReturn_code()==``null` `|| (``"SUCCESS"``.equals(orderResponse.getReturn_code()) && (orderResponse.getErr_code()==``null` `||` `"SYSTEMERROR"``.equals(orderResponse.getErr_code())))){`

`orderResponse = WXPayUtil.httpOrder(orderInfo_toString,``2``);`

`}`

`}`

`LOGGER.debug(``"response 返回字段:==》{}"``,orderResponse);`

`//根据微信文档return_code 和result_code都为SUCCESS的时候才会返回code_url `

`if``(``null``!=orderResponse &&` `"SUCCESS"``.equals(orderResponse.getReturn_code()) &&` `"SUCCESS"``.equals(orderResponse.getResult_code())){ `

`String timestamp = String.valueOf(WXPayUtil.getCurrentTimestamp());`

`map.put(``"timestamp"``,timestamp);`

`map.put(``"noncestr"``,noncestr);`

`UnifiedOrderRequest unifiedOrderRequest = (UnifiedOrderRequest) requestInfo.get(``"unifiedOrderRequest"``);`

`map.put(``"unifiedOrderRequest"``,unifiedOrderRequest);`

`SortedMap<String, String> packageParams =` `new` `TreeMap<String, String>(); `

`packageParams.put(``"appId"``,appId); `

`packageParams.put(``"signType"``,``"MD5"``); `

`packageParams.put(``"nonceStr"``, noncestr); `

`packageParams.put(``"timeStamp"``, timestamp); `

`String packages =` `"prepay_id="``+orderResponse.getPrepay_id();`

`packageParams.put(``"package"``,packages);`

`String sign =` `null``;`

`try` `{`

`//生成签名`

`sign = WXPayUtil.generateSignature(packageParams,apiKey);`

`}` `catch` `(Exception e) {`

`map.put(``"result"``,-``1``);`

`map.put(``"msg"``,``"支付签名信息异常"``);`

`e.printStackTrace();`

`}`

`if``(sign!=``null` `&& !``""``.equals(sign)){`

`LOGGER.debug(``"------------支付签名:"``+sign+``"-------------------"``);`

`map.put(``"paySign"``,sign);`

`map.put(``"result"``,``1``);`

`map.put(``"appId"``,appId);`

`}``else``{`

`map.put(``"result"``,-``1``);`

`map.put(``"msg"``,``"支付签名信息异常"``);`

`}`

`map.put(``"prepay_id"``,orderResponse.getPrepay_id());`

`return` `map; `

`}``else``{` `//不成功`

`if``(orderResponse!=``null``){`

`String text =` `"调用微信支付出错,返回状态码:"``+orderResponse.getReturn_code()+``",返回信息:"``+orderResponse.getReturn_msg();`

`if``(orderResponse.getErr_code()!=``null` `&& !``""``.equals(orderResponse.getErr_code())){`

`text = text +``",错误码:"``+orderResponse.getErr_code()+``",错误描述:"``+orderResponse.getErr_code_des();`

`}`

`LOGGER.error(text);`

`}``else``{`

`LOGGER.error(``"返回值  orderResponse对象为空"``);`

`}`

`map.put(``"result"``,-``1``);`

`map.put(``"msg"``,``"支付环境异常,请稍后再试"``);`

`return` `map; `

`}`

`}`

`}`

jsp代码


`<script type=``"text/javascript"``>`

`//点击支付按钮 开始支付`

`function` `toPay(){`

`//初步判断数据`

`var` `openId=$(``"#openId"``).val();`

`var` `payMoney=$(``"#payMoney"``).val();`

`$.ajax({`

`url :` `"${pageContext.request.contextPath}/toPayInit"``,`

`type:``"POST"``,`

`dataType :` `'json'``,`

`data:{`

`payMoney:payMoney,`

`openId:openId,`

`orderId:``"订单号"`

`},`

`success :` `function``(result) {`

`if``(result.result==1){`

`var` `paySign = result.paySign;`

`var` `prepay_id = result.prepay_id;`

`var` `nonceStr = result.noncestr;`

`var` `timestamp = result.timestamp;`

`var` `unifiedOrderRequest = result.unifiedOrderRequest;`

`var` `spbill_create_ip = unifiedOrderRequest.spbill_create_ip;`

`var` `detail = unifiedOrderRequest.detail;`

`var` `out_trade_no = unifiedOrderRequest.out_trade_no;`

`var` `appId=result.appId;`

`onBridgeReady(paySign,prepay_id,nonceStr,timestamp,appId);`

`}``else``{`

`alert(``"失败"``);`

`}`

`},`

`error :` `function``(data, status, e) {` `// 服务器响应失败时的处理函数`

`alert(``"数据异常,支付失败"``,` `'error'``);`

`}`

`});`

`}`

`//调起公众号支付`

`function` `onBridgeReady(paySign,prepay_id,nonceStr,timestamp,appId){`

`WeixinJSBridge.invoke(`

`'getBrandWCPayRequest'``, {`

`"appId"``:appId,` `//appid`

`"timeStamp"``:timestamp,`

`"nonceStr"``:nonceStr,` `//随机串`

`"package"``:``"prepay_id="``+prepay_id,`

`"signType"``:``"MD5"``,`

`"paySign"``:paySign` `//微信签名`

`},`

`function``(res){`

`// 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回  ok,但并不保证它绝对可靠。`

`if``(res.err_msg ==` `"get_brand_wcpay_request:ok"` `) {`

`alert(``"支付完成"``,` `'success'``);`

`}``else` `if``(res.err_msg ==` `"get_brand_wcpay_request:cancel"` `) {`

`alert(``"取消支付"``,` `'success'``);`

`}``else` `if``(res.err_msg ==` `"get_brand_wcpay_request:fail"``){`

`alert(``"支付失败"``,` `'success'``);`

`}`

`}`

`);`

`}`

`</script>`

定义微信支付成功回调接口APIAupostController.java


`package` `com.yiexpress.api.controller.ewe.aupost;`

`import` `java.util.HashMap;`

`import` `java.util.Map;`

`import` `javax.annotation.Resource;`

`import` `javax.servlet.ServletInputStream;`

`import` `javax.servlet.http.HttpServletRequest;`

`import` `javax.servlet.http.HttpServletResponse;`

`import` `org.apache.commons.collections.MapUtils;`

`import` `org.slf4j.Logger;`

`import` `org.slf4j.LoggerFactory;`

`import` `org.springframework.beans.factory.annotation.Value;`

`import` `org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;`

`import` `org.springframework.stereotype.Controller;`

`import` `org.springframework.web.bind.annotation.RequestMapping;`

`import` `org.springframework.web.bind.annotation.ResponseBody;`

`import` `com.yiexpress.core.utils.wechat.WXPayUtil;`

`@Controller`

`@RequestMapping``(``"/api"``)`

`public` `class` `APIAupostController {`

`private` `static` `final` `Logger LOGGER=LoggerFactory.getLogger(APIAupostController.``class``);`

`@Resource``(name =` `"jacksonBean"``)`

`private` `MappingJackson2HttpMessageConverter jackson;`

`private` `String apiKey=``"商户密匙"``;``//商户密匙`

`/**`

`* 异步回调接口`

`* @param request`

`* @param response`

`* @throws Exception`

`*/`

`@RequestMapping``(value=``"/paymentNotice"``,produces=``"text/html;charset=utf-8"``)`

`@ResponseBody`

`public` `String WeixinParentNotifyPage(HttpServletRequest request,HttpServletResponse response)` `throws` `Exception{`

`ServletInputStream instream = request.getInputStream();`

`StringBuffer sb =` `new` `StringBuffer();`

`int` `len = -``1``;`

`byte``[] buffer =` `new` `byte``[``1024``];`

`while``((len = instream.read(buffer)) != -``1``){`

`sb.append(``new` `String(buffer,``0``,len));`

`}`

`instream.close();`

`Map<String,String> map = WXPayUtil.xmlToMap(sb.toString());``//接受微信的回调的通知参数`

`Map<String,String> return_data =` `new` `HashMap<String,String>();`

`//判断签名是否正确`

`if``(WXPayUtil.isSignatureValid(map,apiKey)){`

`if``(map.get(``"return_code"``).toString().equals(``"FAIL"``)){`

`return_data.put(``"return_code"``,` `"FAIL"``);`

`return_data.put(``"return_msg"``, map.get(``"return_msg"``));`

`}``else` `{`

`String return_code=MapUtils.getString(map,``"return_code"``);`

`String result_code=MapUtils.getString(map,``"result_code"``);`

`if``(return_code!=``null` `&&` `"SUCCESS"``.equals(return_code) && result_code!=``null` `&&` `"SUCCESS"``.equals(result_code)){`

`String out_trade_no =MapUtils.getString(map,``"out_trade_no"``);``//系统订单号`

`//支付成功,可以自定义新逻辑`

`}`

`}`

`}``else``{`

`return_data.put(``"return_code"``,` `"FAIL"``);`

`return_data.put(``"return_msg"``,` `"签名错误"``);`

`}`

`String xml = WXPayUtil.GetMapToXML(return_data);`

`LOGGER.error(``"支付通知回调结果:"``+xml);`

`return` `xml;`

`}`

`}`

以上就是本文的全部内容,希望对大家的学习有所帮助。