注意的是
1、支付方法的路径必须在支付授权目录中设置的路径下边 否则报错
2、用于生成预支付id的签名参数必须和提交到微信的商品参数一致否则报错。
3、签名的问题:在使用商户平台提供的支付方式支付的时候只需要两个签名 得到预支付id需要的签名 和 支付时使用的签名, 如果使用公众平台提供的jssdk当中的支付方式需要三种签名 验证支付需要的签名、 得到预支付id需要的签名、 支付时使用的签名

微信支付的流程:
得到签名—>得到预支付id—>得到预支付id—>得到支付签名—->支付

// 准备字符串获得public static String create_nonce_str() {String uuid = UUID.randomUUID().toString();uuid = uuid.replace("-", "");if (uuid.length() > 32) {uuid = uuid.substring(0, 32);}return uuid;}
/*** 微信签名 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。*/public static String createSign(SortedMap<String, String> packageParams) {StringBuffer sb = new StringBuffer();Set es = packageParams.entrySet();// 所有参与传参的参数按照accsii排序(升序)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 Key = WinxinFinalValue.API_SECRET;sb.append("key=" + Key);System.out.println("md5 sb:" + sb);String sign = MD5Utils.MD5Encode(sb.toString(), "UTF-8").toUpperCase();System.out.println("packge签名:" + sign);return sign;}
package com.team.weixin.util;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;import com.team.weixin.model.Pay;
import com.team.weixin.model.ReceiveXmlEntity;
public class SerializeXmlUtil {/*** @description 将xml字符串转换成map* @param xml* @return Map*//*** 解析微信xml消息* * @param strXml* @return*/public static Pay getMsgEntity(String strXml) {System.out.println("99999999999999999999999999999");System.out.println(strXml);System.out.println("99999999999999999999999999999");Pay msg = null;try {if (strXml.length() <= 0 || strXml == null)return null;// 将字符串转化为XML文档对象Document document = DocumentHelper.parseText(strXml);// 获得文档的根节点Element root = document.getRootElement();// 遍历根节点下所有子节点Iterator<?> iter = root.elementIterator();// 遍历所有结点msg = new Pay();// 利用反射机制,调用set方法// 获取该实体的元类型System.out.println("在这里");Class<?> c = Class.forName("com.team.weixin.model.Pay");System.out.println("在这里55");msg = (Pay) c.newInstance();// 创建这个实体的对象while (iter.hasNext()) {Element ele = (Element) iter.next();// 获取set方法中的参数字段(实体类的属性)Field field = c.getDeclaredField(ele.getName());// 获取set方法,field.getType())获取它的参数数据类型String first = ele.getName().substring(0, 1).toUpperCase();String rest = ele.getName().substring(1, ele.getName().length());String newStr = new StringBuffer(first).append(rest).toString();System.out.println("set" +newStr+","+field.getType());Method method = c.getDeclaredMethod("set" +newStr, field.getType());method.invoke(msg, ele.getText());// 调用set方法}} catch (Exception e) {// TODO: handle exceptionSystem.out.println("xml 格式异常: " + strXml);e.printStackTrace();}return msg;}}
// 得到prepay_idpublic static String getPayNo(String url, String xmlParam) {DefaultHttpClient client = new DefaultHttpClient();HttpPost httpost = new HttpPost(url);client.getParams().setParameter(ClientPNames.ALLOW_CIRCULAR_REDIRECTS, true);String prepay_id = "";String nustr = "";try {httpost.setEntity(new StringEntity(xmlParam, "UTF-8"));HttpResponse response = client.execute(httpost);String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8");Map<String, Object> dataMap = new HashMap<String, Object>();System.out.println(jsonStr);prepay_id = SerializeXmlUtil.getMsgEntity(jsonStr.toString()).getPrepay_id();nustr = SerializeXmlUtil.getMsgEntity(jsonStr.toString()).getNonce_str();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return prepay_id + "," + nustr;}
// 调用预支付订单public static WeixinUnifiedOrder getUnifiedOrder(WeixinUnifiedOrder order, String openid)throws UnknownHostException {openid = "oJBwTwTjJTp4BNHlJC38c4Xczjjk";String nonce_str = WeixinUtil.create_nonce_str();String notify_url = "www.shujb.com" + "/weixingroup/weixin/paySuccess";String spbill_create_ip = InetAddress.getLocalHost().getHostAddress().toString();// 获得本机IPorder.setAppid("appid 由商户提供");order.setMch_id("商户id(商户平台提供) 由商户提供");order.setNonce_str(nonce_str);order.setNotify_url(notify_url);order.setSpbill_create_ip(spbill_create_ip);order.setTrade_type("JSAPI");SortedMap<String, String> packageParams = new TreeMap<String, String>();packageParams.put("appid", order.getAppid());packageParams.put("mch_id", order.getMch_id());packageParams.put("device_info", "WEB");packageParams.put("nonce_str", order.getNonce_str());packageParams.put("body", order.getBody());packageParams.put("out_trade_no", order.getOut_trade_no());packageParams.put("total_fee", order.getTotal_fee());packageParams.put("spbill_create_ip", order.getSpbill_create_ip());packageParams.put("notify_url", order.getNotify_url());packageParams.put("trade_type", order.getTrade_type());/* packageParams.put("attach", order.getAttach()); */packageParams.put("openid", openid);String sign = createSign(packageParams);// 创建用于获得预支付id的签名String xml = "<xml>" + "<appid>" + order.getAppid() + "</appid>" + "<mch_id>" + order.getMch_id() + "</mch_id>"+ "<device_info><![CDATA[WEB]]></device_info>" + "<nonce_str>" + order.getNonce_str() + "</nonce_str>"+ "<sign><![CDATA[" + sign + "]]></sign>" + "<body>" + order.getBody() + "</body>" + "<out_trade_no>"+ order.getOut_trade_no() + "</out_trade_no>" + "<total_fee>" + order.getTotal_fee() + "</total_fee>"+ "<spbill_create_ip>" + order.getSpbill_create_ip() + "</spbill_create_ip>" + "<notify_url>"+ order.getNotify_url() + "</notify_url>" + "<trade_type>" + order.getTrade_type() + "</trade_type>" +/* "<attach>" + order.getAttach() + "</attach>"+ */"<openid>" + openid + "</openid>" + "</xml>";System.out.println(xml);// 得到prepay_idString createOrderURL = "https://api.mch.weixin.qq.com/pay/unifiedorder";String prepay_id = "";try {String[] pi = getPayNo(createOrderURL, xml).split(",");prepay_id = pi[0];order.setPrepay_id(prepay_id);if (prepay_id.equals("")) {System.out.println("统一支付接口获取预支付订单出错");}} catch (Exception e1) {// TODO Auto-generated catch blocke1.printStackTrace();}return order;}
这里是controller中的调用统一下单接口
//支付模块//支付@RequestMapping("/to_pay")public String to_pay(@RequestParam("money") String money , HttpServletRequest request,HttpSession seeion,Model model){//获得订单号//获得WeixinUnifiedOrder order = new WeixinUnifiedOrder();order.setAttach("附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据");//附加消息order.setTotal_fee("1");//金额order.setBody("罗辑思维-图书");//order.setOut_trade_no(primaryKeyFactory.generatePrimaryKey()+"");try {order = WeixinUtil.getUnifiedOrder(order, seeion.getAttribute("openid")+"");//生成支付签名String timestamp = WeixinUtil.create_timestamp();String nonceStr =WeixinUtil.create_nonce_str();String prepay_id = "prepay_id="+order.getPrepay_id();//创建支付用的数据SortedMap<String, String> finalpackage = new TreeMap<String, String>();finalpackage.put("appId", WinxinFinalValue.AppID);  finalpackage.put("timeStamp", timestamp);  finalpackage.put("nonceStr", nonceStr);  finalpackage.put("package", prepay_id);  finalpackage.put("signType", "MD5");String paySign =  WeixinUtil.createSign(finalpackage);//创建支付用的签名PayReg payReg = new PayReg();payReg.setAppid(WinxinFinalValue.AppID);payReg.setTimeStamp(timestamp);payReg.setNonceStr(nonceStr);payReg.setPackages("prepay_id="+order.getPrepay_id());payReg.setSignType("MD5");payReg.setSign(paySign);model.addAttribute("obj",payReg);} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();}return "/dataTreasure/pay";}

微信开发之微信支付(商户平台提供的方式)相关推荐

  1. php 微信支付 ca证书,微信公众号红包接口开发PHP开发 CA证书出错,请登陆微信支付商户平台下载证书...

    微信红包接口调试过程中一直提示"CA证书出错,请登陆微信支付商户平台下载证书",经反复调试,大致解决方法如下: 1.首先确保CA证书的路径是否正确,一定得是绝对路径,因为是PHP开 ...

  2. 微信支付(商户平台)卡券开发文档

    文章目录 简介 代金券 代金券分类 预充值代金券 免充值代金券 发券渠道 二维码发券 营销活动发券 高级API接口发券 核销方式 支付中自动核销券 操作指引 开发前准备 开通代金券权限 下载API证书 ...

  3. 微信 账户升级服务器地址,微信支付商户平台账户升级后有哪些新功能呢?

    注册了微信公众号的服务号,是可以再申请微信支付的,自从微信公众号的兴起,随着技术的改革和革新,微信公众号也随着做出了不少的调整和变化,首先,微信支付商户平台账户升级,这标志着微信服务好有了很多不同的地 ...

  4. node 微信红包 证书出错,请登录微信支付商户平台下载证书

    按照官方文档写的代码,测试给自己发红包时,提示证书出错,请登录微信支付商户平台下载证书. 我是用的superagent库,错误前的核心代码是: const url = 'https://api.mch ...

  5. 此IP地址不允许调用接口,如有需要请登录微信支付商户平台更改配置

    调用微信企业付款提示"此IP地址不允许调用接口,如有需要请登录微信支付商户平台更改配置". 配置步骤: 1.登录微信商户,进入产品中心,以企业付款到零钱为例,点击产品设置: 2.找 ...

  6. 登录微信支付商户平台-产品中心,开通企业付款的方法

    2019独角兽企业重金招聘Python工程师标准>>> 登录微信支付商户平台-产品中心,开通企业付款的时候,找不到该功能,上网搜集的解决方法,亲测可行. 1.登录微信支付商户平台 2 ...

  7. 微信企业付款 ”错误码:NO_AUTH,错误信息:此IP地址不允许调用接口,如有需要请登录微信支付商户平台更改配置“报错的处理办法

    提示"错误码:NO_AUTH,错误信息:此IP地址不允许调用接口,如有需要请登录微信支付商户平台更改配置" 快速解决问题!!! 解说一下这个IP:这个IP是你发起支付的服务器外网I ...

  8. java 微信转账 ca_error_对接微信红包时:CA证书出错,请登录微信支付商户平台下载证书...

    今天在对接微信支付的微信红包发放时,出现""CA证书出错,请登录微信支付商户平台下载证书"的错误,特此记录一下: 如果你也在对接微信红包,并且你也在这个页面上下载了dem ...

  9. 解决问题:CA_ERROR证书出错,请登录微信支付商户平台下载证书-企业付款到零钱接口(原创)

    解决问题:CA_ERROR证书出错,请登录微信支付商户平台下载证书-企业付款到零钱接口(原创) 参考文章: (1)解决问题:CA_ERROR证书出错,请登录微信支付商户平台下载证书-企业付款到零钱接口 ...

  10. php微信商务平台 红包调用,微信平台红包接口怎么调用?微信支付商户平台红包发放接口调用图文教程[多图]...

    微信平台红包接口怎么调用?估计很多商家都还不太会操作吧?别着急,下面是友情小编搜集相关资料整理出来的微信支付商户平台红包发放接口调用图文教程,希望可以帮到大家,现在就跟随小编一起看看吧!!! 首先,商 ...

最新文章

  1. 昨天又帮爸DIY了一台工作电脑
  2. mybatis使用foreach实现sql的in查询
  3. unity三维向量变化为角度_对于向量和矩阵的理解
  4. 2020-12-3(详解虚拟地址如何转化为物理地址)
  5. python底层源码_Python每天一分钟:解析python底层类的实现原理——竟然是type()
  6. 来点硬件知识吧,今天求职吃亏了!
  7. URI和URL、URN的区别
  8. RFC chinese
  9. 移动web:tab选项卡
  10. 数据分析师的工作绩效到底是什么?
  11. Excel快捷键:Ctrl+E的功能汇总
  12. 三重积分(Triple Integral)
  13. 广告投放策略及数据分析
  14. 专访阿里巴巴元境王矛:打造研运一体化平台,去做开创性的事
  15. 国家高新技术企业认定知识产权这样拿高分
  16. python英文发音-用Python写一个背英文单词程序
  17. 苹果支付验证回执单相关错误码
  18. BCAM(Binary Content Addressable Memory)和TCAM(Ternary Content Addressable Memory)
  19. Bitmap 贴图加工成 PBR 贴图
  20. PID控制参数整定(调节方法)原理+图示+MATLAB调试

热门文章

  1. sat数学可以用计算机吗,SAT数学计算器怎么使用?
  2. 【Testin云测活动】邀请好友使用Testin云测,得iPhone6!
  3. 如何让自己成为一个优秀的Java架构师,而不是码农
  4. matlab 图片生成mif文件,使用MATLAB一鍵制作mif文件
  5. hive经典面试题1--根据主播上播、下播时间戳求播出时长
  6. deepfacelab SAE 模型训练参数详解
  7. 网站建设需做的工作,你知道吗?
  8. 2021全国大学生电子设计竞赛F题参赛简记
  9. windows无法连接到打印机,打印处理器不存在
  10. 方法重载和重写的区别