1. 写好配置项

#微信支付接口
ias.pay.wxpay.payUrl=https://api.mch.weixin.qq.com/pay/unifiedorder
#回调地址
ias.pay.wxpay.notifyUrl=
#终端IP
ias.pay.wxpay.spbillCreateIp=
ias.pay.wxpay.appId=
ias.pay.wxpay.mchId=
ias.pay.wxpay.tradeType=APP
ias.pay.wxpay.packages=Sign=WXPay
ias.pay.wxpay.key=

2. java测试用例调用微信第三方支付,其中的payProp为配置项,

 @Autowiredprivate PayProp payProp;@Testpublic void createPay() {WxPay wxPay = new WxPay();wxPay.setPayUrl(payProp.getWxpay().getPayUrl());wxPay.setAppId(payProp.getWxpay().getAppId());wxPay.setMchId(payProp.getWxpay().getMchId());wxPay.setSpbillCreateIp(payProp.getWxpay().getSpbillCreateIp());wxPay.setNotifyUrl(payProp.getWxpay().getNotifyUrl());wxPay.setTradeType(payProp.getWxpay().getTradeType());wxPay.setKey(payProp.getWxpay().getKey());wxPay.setBody("腾讯充值中心-QQ会员充值");wxPay.setNonceStr(随机字符串,长度要求在32位以内。);wxPay.setOutTradeNo(订单号);wxPay.setTotalFee(支付金额);wxPay.setSign(WeiXinUtil.sign(wxPay, wxPay.getKey()));String xml = XmlUtil.toXml(wxPay);log.debug("微信支付xml为:\n{}", xml);String results = RestClient.getClient().postForObject(wxPay.getPayUrl(), xml, String.class);log.debug("返回的xml:\n{}", results.toString());WXResults wxResults = XmlUtil.toBean(results, WXResults.class);if(StringUtil.equals(wxResults.getReturnCode(), "SUCCESS")) {log.debug("返回信息", wxResults.toString());} else {throw new BusinessException(30010, wxResults.getReturnMsg());}}

3。支付成功,回调接口

 @RequestMapping(value="wxpay/notify", produces={"application/xml"})public String notify(@RequestBody String callback) throws DocumentException {log.debug("微信支付回调xml为:{}", callback);WxNotify notify = XmlUtil.toBean(callback, WxNotify.class);if(notify.getReturnCode().equals("SUCCESS") || notify.getResultCode().equals("SUCCESS")) {Map<String, Object> map =  XmlUtil.xml2map(callback, false);boolean signVerified = WeiXinUtil.isWechatSign(map, payProp.getWxpay().getKey());if(signVerified) {log.info("微信支付验签成功!!!");log.info("微信支付完成!!!!!");}}return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";}

4.其中用到的XmlUtil帮助类附上代码

    /** * xml转map 不带属性 * @param xmlStr * @param needRootKey 是否需要在返回的map里加根节点键 * @return * @throws DocumentException */  public static Map<String,Object> xml2map(String xmlStr, boolean needRootKey) throws DocumentException {  Document doc = DocumentHelper.parseText(xmlStr);  Element root = doc.getRootElement();  Map<String, Object> map = xml2map(root);  if(root.elements().size()==0 && root.attributes().size()==0){  return map;  }  if(needRootKey){  //在返回的map里加根节点键(如果需要)  Map<String, Object> rootMap = new HashMap<String, Object>();  rootMap.put(root.getName(), map);  return rootMap;  }  return map;  } /***  将传入xml文本转换成Java对象* @Title: toBean * @param xmlStr* @param cls  xml对应的class类* @return T   xml对应的class类的实例对象* * 调用的方法实例:PersonBean person=XmlUtil.toBean(xmlStr, PersonBean.class);*/public static <T> T  toBean(String xmlStr,Class<T> cls){//注意:不是new Xstream(); 否则报错:java.lang.NoClassDefFoundError: org/xmlpull/v1/XmlPullParserFactoryXStream xstream=new XStream(new DomDriver());xstream.processAnnotations(cls);T obj=(T)xstream.fromXML(xmlStr);return obj;            } 

5. 涉及到的生成签名和验签工具类代码

package com.ias.server.pay.util;import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.ias.common.utils.bean.ClassUtil;
import com.ias.common.utils.collection.ArrayUtils;
import com.ias.common.utils.date.TimeUtil;
import com.ias.common.utils.encrypt.MD5Util;
import com.ias.common.utils.string.StringUtil;
import com.ias.server.pay.annotations.Sign;public class WeiXinUtil {private static final Logger log = LoggerFactory.getLogger(WeiXinUtil.class);/** * 微信支付签名* @author: jiuzhou.hu* @date:2017年3月15日下午12:54:52 * @param obj* @param keyStr* @return*/public static String sign(Object obj, String keyStr) {Map<String, String> fields = new HashMap<>();for(Field field : obj.getClass().getDeclaredFields()) {Sign sign = field.getAnnotation(Sign.class);if(field.getAnnotation(Sign.class) != null) {fields.put(field.getName(), sign.value());}}List<String> signs = new ArrayList<>();for(String key:fields.keySet()) {Object ov = ClassUtil.getFieldValue(obj, key);if(ov != null) {signs.add(fields.get(key) + "=" + ov);}}signs.sort((String s1, String s2) -> s1.compareTo(s2));signs.add("key=" + keyStr);String _signs = ArrayUtils.toString(signs,'&');log.debug("未加密的sign串为:{}", _signs);String md5Sign = MD5Util.encode(_signs).toUpperCase();log.debug("md5加密过的sign串为:{}", md5Sign);return md5Sign;}/*** 微信验签* @author feng.ye* @date 2018年7月19日 下午1:27:27* @param map * @param apiKey* @return*/@SuppressWarnings("rawtypes")public static boolean isWechatSign(Map<String, Object> map,String apiKey) {StringBuffer sb = new StringBuffer();Set es = map.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 (!"sign".equals(k) && null != v && !"".equals(v) && !"key".equals(k)) {sb.append(k + "=" + v + "&");}}sb.append("key=" + apiKey);String sign = MD5Util.encode(sb.toString()).toUpperCase();log.debug("新生成签名为:{}", sign);String validSign = ((String) map.get("sign")).toUpperCase();log.debug("微信端返回签名为:{}", validSign);if(StringUtil.isNotBlank(validSign) && StringUtil.equals(sign, validSign)) {return true;}else {return false;}}/** * 获取10位时间戳* @author: jiuzhou.hu* @date:2017年3月15日下午1:17:49 * @return*/public static long timestamp() {return Long.parseLong(String.valueOf(TimeUtil.getSysTimestamp().getTime()).toString().substring(0,10));}
}

java微信第三方支付相关推荐

  1. Java对接第三方支付渠道之微信支付APIV3版本

    提示:微信支付APIV3版本对接流程梳理,目前微信支付提供APIV3和APIV2两个版本,简而言之,V3版本的安全性比V2更高. Java对接第三方支付渠道之微信支付APIV3版本 一.接入指引 1. ...

  2. Java对接第三方支付渠道之支付宝支付

    提示:支付宝相对于微信支付更人性化,且细节做得更好. Java对接第三方支付渠道之支付宝支付 一.前期准备工作 二.导入依赖 三.书写配置类 四.书写配置文件 五.调用相关支付接口 1.流程图 2.创 ...

  3. JAVA+微信JSAPI支付

    JAVA+微信JSAPI支付 引入依赖 获取请求ip 组装微信支付请求 回调处理 引入依赖 <dependency><groupId>com.github.binarywang ...

  4. java微信第三方平台全网发布(三)

    在java微信第三方平台开发(二)中写了授权事件的处理,并且第三方平台代公众号发起网页授权,获取用户信息和发红包等基本业务.接下来代公众号处理消息和事件.这时候就需要用到在开发者资料中填写的公众号消息 ...

  5. Java微信APP支付-申请退款

    前面已经讲过微信APP支付的统一下单.支付结果通知的接口开发,现在我们讲述一下申请退款的流程开发. 官方的API地址:https://pay.weixin.qq.com/wiki/doc/api/ap ...

  6. JAVA微信APP支付接口整合

    2019独角兽企业重金招聘Python工程师标准>>> 上次我们看到了支付宝的APP支付工具,那么这次就来封装封装微信的APP支付;如果已经清楚了支付宝的支付流程,那么微信支付也和它 ...

  7. java微信网页支付_java实现微信H5支付

    原标题:java实现微信H5支付 前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间,终于折腾出来了!鉴于坑爹的微信官方没有提供Java版的demo,所以全靠自己按照同样坑爹 ...

  8. Java 微信jsapi支付

    spring boot微信jsapi支付 话不多说,撸起袖子就是干,下面上源码 pom.xml 配置文件 resources/wx.properties 配置类 service(WechatPaySe ...

  9. php支付宝第三方授权,thinkphp支付宝,微信第三方支付(PC版)

    支付宝支付 1:首先去支付宝的官网下载第三方sdk,如下图放在vendor下面 目录结构 然后在公共方法里面封装一个pay.class.php的方法,来处理第三方支付 贴上源码 //支付宝 publi ...

最新文章

  1. IE内嵌google chrome frame解决浏览器兼容问题
  2. 【深度学习入门到精通系列】CIFAR-10数据集说明
  3. linux进程同步/通信,线程同步/通信的区别
  4. linux下elasticsearch 安装、配置及示例
  5. 搜狗浏览器验证码无法显示_逃离塔科夫账号注册-验证码不显示
  6. 主席树 - 可持久化线段树
  7. 数据结构与算法理论概述
  8. java 三级考试_java三级考试理论题
  9. SQL Server LIKE语句使用举例
  10. 50道编程小题目之【完全平方数】
  11. 饮冰三年-人工智能-Python-16Python基础之迭代器、生成器、装饰器
  12. Npm安装node-sass包依赖时报错 Cannot download “https://github.com/sass/node-sass/releases/download
  13. 浅谈深度学习中的激活函数
  14. 我的第一个博客正式注册
  15. Kubernetes Job Controller源码分析
  16. 七月算法机器学习 7 工作流程与模型调优
  17. Java实现获取汉字的拼音(首拼)
  18. 如何实现Iframe透明
  19. python读取文本后如何加拼音_[编程心得]用Python给汉字加上带音调的拼音
  20. 瑞典皇家理工学院计算机学什么,瑞典留学 皇家理工学院的学科设置

热门文章

  1. 狗狗币暴涨暴跌?数据分析师带你走进它的前世今生!
  2. 微信重大更新,mac版可刷朋友圈!
  3. lintcode 7. 二叉树的序列化和反序列化 Python代码
  4. Python中numpy读取高维数组中特定的行,列
  5. sublime text下 Python 问题:TabError: inconsistent use of tabs and spaces in indentation
  6. LeetCode中二叉树题目总结
  7. PyCharm LicenseServer 破解
  8. “等等党”的春天到了?高端显卡暴降35% 华强北商家:还会继续降
  9. 三星Galaxy S22 Ultra发布推迟:此前至少5款骁龙8平台旗舰亮相
  10. 3个月亏17亿,贝壳释放了什么信号?