微信支付网页二维码NATIVE

微信支付有一个大坑,就是大额支付的时候,会出问题,我再这先说一下

第一步

需要找你的老大,要三个东西 1: appid(公众账号ID) 2:mch_id(商户号)3:key(商户的key(API密匙)

第二步

配置文件

@Component
@ConfigurationProperties(prefix=“wxpayconfig”)

@Data
public class wxpayconfig {

private  String appid=""; // 公众账号IDprivate String mch_id=""; // 商户号private String device_info=""; // 设备号private String key=""; // 商户的key【API密匙】private String url=""; // api请求地址private String notify_url=""; // 服务器异步通知页面路径private String return_url = "";; // 服务器同步通知页面路径private String wx_package="Sign=WXPay";

}
//Controller

public Object mahuatengnbpay(String Total_fee,String Product_id,String Out_trade_no,String Body,String VSystemId, HttpServletRequest request, HttpServletResponse response) throws Exception {Map<String, Object> map = new HashMap<>();//获取订单信息String spbill_create_ip = getRemortIP(request);// "127.0.0.1";String  trade_type = "NATIVE";//""双引号里写你的参数和wxpayconfig的东西String nonce_str = Util.getRandomString(18);StringBuffer stringBuffer = new StringBuffer();stringBuffer.append("appid=" + "");//小程序APPIDstringBuffer.append("&body=" +  "");//商品描述stringBuffer.append("&mch_id=" + "");//商户号stringBuffer.append("&nonce_str=" + "");//随机字符串,长度要求在32位以内stringBuffer.append("&notify_url=" + "");//通知地址stringBuffer.append("&out_trade_no=" +  "");//商户系统内部订单号,要求32个字符内,只能是数字、大小写字母stringBuffer.append("&product_id="+ "");stringBuffer.append("&spbill_create_ip=" + spbill_create_ip);//终端IPstringBuffer.append("&total_fee=" +  "");//支付金额stringBuffer.append("&trade_type=" + trade_type);//交易类型stringBuffer.append("&key=" +  "");//商户Key//获取第一次签名String sign = MD5(stringBuffer.toString());StringBuffer payXML = new StringBuffer();payXML.append("<xml>");payXML.append("<appid>" +""+ "</appid>");payXML.append("<body>" +  "" + "</body>");payXML.append("<mch_id>" + "" + "</mch_id>");payXML.append("<nonce_str>" +"" + "</nonce_str>");payXML.append("<notify_url>" +"" + "</notify_url>");payXML.append("<out_trade_no>" + "" + "</out_trade_no>");payXML.append("<product_id>" + "" + "</product_id>");payXML.append("<spbill_create_ip>" + spbill_create_ip + "</spbill_create_ip>");payXML.append("<total_fee>" +  ""+ "</total_fee>");payXML.append("<trade_type>" + ""+ "</trade_type>");payXML.append("<sign>" + sign + "</sign>");payXML.append("</xml>");//payXML和stringBuffer一定要想同System.out.println(payXML);String wxUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";String weixinPost = sendPost(wxUrl, payXML.toString());UnifiedorderResult unifiedorderResult = ParseXMLUtils.jdomParseXml(weixinPost);// 解析微信的反馈if (unifiedorderResult != null) {if ("SUCCESS".equals(unifiedorderResult.getReturn_code())) {if ("INVALID_REQUEST".equals(unifiedorderResult.getErr_code())) {map.put("code", UserStatusEnum.ERROR);map.put("msg", "参数错误");return map;}wxpayconfig wxpayconfig = new wxpayconfig();// 开始拼接App调起微信的参数SortedMap<Object, Object> wxAppparameters = new TreeMap<Object, Object>();wxAppparameters.put("appid", unifiedorderResult.getAppid());wxAppparameters.put("code_url", unifiedorderResult.getCode_url());wxAppparameters.put("partnerid", unifiedorderResult.getMch_id());wxAppparameters.put("prepayid", unifiedorderResult.getPrepay_id());wxAppparameters.put("package", wxpayconfig.getWx_package());wxAppparameters.put("noncestr", nonce_str);wxAppparameters.put("timestamp", String.valueOf(new Date().getTime()).substring(0, 10));wxAppparameters.put("sign", sign);map.put("code", UserStatusEnum.SUCCESS);map.put("msg", UserStatusEnum.SUCCESS);map.put("data", wxAppparameters);QRCodeUtil.createQrCodeStream(unifiedorderResult.getCode_url(),300,"JPEG",response);/*String codeUrl = entity.getCode_url();//使用订单号来作为二维码的图片名称File file = new File(QRCodeUtil.PAY_PATH,orderNumber+".jpg");QRCodeUtil.createImage(codeUrl,new FileOutputStream(file));//把订单号传到支付页面model.addAttribute("orderNumber",orderNumber);*/return map;} else {System.out.println("错误原因为:" + unifiedorderResult.getReturn_msg());map.put("code", UserStatusEnum.ERROR);map.put("msg", unifiedorderResult.getReturn_msg());return map;}}return "pay";
}public static String sendPost(String url, String signXml) throws ClientProtocolException, IOException, UnrecoverableKeyException, KeyManagementException, KeyStoreException, NoSuchAlgorithmException    {HttpPost httpPost = new HttpPost(url);//解决XStream对出现双下划线的bugXStream xStreamForRequestPostData = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_")));//得指明使用UTF-8编码,否则到API服务器XML的中文不能被成功识别StringEntity postEntity = new StringEntity(signXml, "UTF-8");httpPost.addHeader("Content-Type", "text/xml");httpPost.setEntity(postEntity);//设置请求器的配置RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();httpPost.setConfig(requestConfig);HttpClient httpClient = HttpClients.createDefault();HttpResponse response = httpClient.execute(httpPost);HttpEntity entity =  response.getEntity();String result = EntityUtils.toString(entity, "UTF-8");return result;
}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();// 获得MD5摘要算法的 MessageDigest 对象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];}return new String(str);} catch (Exception e) {e.printStackTrace();return null;}
}
public static String getRemortIP(HttpServletRequest request) {if (request.getHeader("x-forwarded-for") == null) {return request.getRemoteAddr();}return request.getHeader("x-forwarded-for");
}
public static boolean isTenpaySign(String characterEncoding, SortedMap<Object, Object> packageParams,String API_KEY) {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 (!"sign".equals(k) && null != v && !"".equals(v)) {sb.append(k + "=" + v + "&");}}sb.append("key=" + API_KEY);// 算出摘要String mysign =MD5(sb.toString()).toLowerCase();String tenpaySign = ((String) packageParams.get("sign")).toLowerCase();return tenpaySign.equals(mysign);
}
@RequestMapping("/wechatnotify")
public String weChatNotify(HttpServletRequest  request) throws IOException, JDOMException {String returnXML = null;Map<String, String> map = new HashMap<>();System.out.println("----------------微信回调开始啦----------------------");// 读取参数InputStream inputStream;StringBuffer sb = new StringBuffer();inputStream = request.getInputStream();String s;BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));while ((s = in.readLine()) != null) {sb.append(s);}in.close();inputStream.close();// 解析xml成mapMap<String, String> m = new HashMap<String, String>();m = WXSignUtils.doXMLParse(sb.toString());// 过滤空 设置 TreeMap/* QueryWrapper<TBWxpay> wrapper = new QueryWrapper<>();wrapper.eq("VSystemId",VSystemId);TBWxpay one = tBWxpayService.getOne(wrapper);*/SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();Iterator<String> it = m.keySet().iterator();while (it.hasNext()) {String parameter = it.next();String parameterValue = m.get(parameter);String v = "";if (null != parameterValue) {v = parameterValue.trim();}System.out.println("p:" + parameter + ",v:" + v);packageParams.put(parameter, v);}// 微信支付的API密钥wxpayconfig wxpayconfig = new wxpayconfig();String key = wxpayconfig.getKey();if(!isTenpaySign("UTF-8", packageParams, key)){map.put("return_code", "FAIL");map.put("return_msg", "return_code不正确");return StringUtil.GetMapToXML(map);}/*//返回状态存入redis中if(m.get("return_code").equals("SUCCESS")){RedisUtil.set("wx"+m.get("out_trade_no"),m.get("result_code"),300);}*/if (isTenpaySign("UTF-8", packageParams, key)) {// 验证通过if ("SUCCESS".equals((String) packageParams.get("result_code"))) {String out_trade_no = (String) packageParams.get("out_trade_no");/* 订单不为空 */if (!Util.isEmpty(out_trade_no)) {//支付成功后的业务处理/*OrderEntity order = orderMapper.getOrderInfo(Long.valueOf(out_trade_no));if(!Util.isEmpty(order)){order.setStatus(CalculatStaticConstant.CHECK_ONE);order.setCompleteTime(DateUtil.currentDate());orderMapper.updateOrder(order);System.out.println("----------------修改订单状态----------------------");}*//* 添加支付信息 *//*OrderPayEntity orderPay = new OrderPayEntity();orderPay.setId(Long.valueOf(IdUtils.getPrimaryKey()));orderPay.setOrderId(order.getId());orderPay.setUserId(order.getUserId());orderPay.setPayPrice(order.getActualPrice());orderPay.setPayType(PayTypeEnum.WE_CHAT_PAY.intKey());orderPay.setStatus(CalculatStaticConstant.CHECK_ONE);orderPay.setPayTime(DateUtil.currentDate());orderMapper.saveOrderPay(orderPay);*/System.out.println("----------------添加支付信息----------------------");map.put("return_code", "SUCCESS");map.put("return_msg", "OK");return StringUtil.GetMapToXML(map);}}} else {System.out.println("支付失败");map.put("return_code", "error");map.put("return_msg", "支付失败");return StringUtil.GetMapToXML(map);}System.out.println("支付失败");System.out.println("支付失败");map.put("return_code", "error");map.put("return_msg", "支付失败");return StringUtil.GetMapToXML(map);
}

public class WXSignUtils {
/**
* @Function: 解析XML
* @author: YangXueFeng
* @Date: 2019/6/17 17:07
*/

     public static Map doXMLParse(String strxml) throws JDOMException,IOException {strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");if (null == strxml || "".equals(strxml)) {return null;}Map m = new HashMap();InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));SAXBuilder builder = new SAXBuilder();Document doc = builder.build(in);org.jdom.Element root = doc.getRootElement();List list = root.getChildren();Iterator it = list.iterator();while (it.hasNext()) {org.jdom.Element e = (org.jdom.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()) {org.jdom.Element e = (org.jdom.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();
}
}/*** @author hncdyj123@163.com* @version V1.0* @Title: StringUtil.java* @Description: com.isoftstone.workflowplugin.utils* @Package com.isoftstone.workflowplugin.utils* @date 2012-7-2*/

public class StringUtil {

/*** 判断一个字符串Str是否为空 return true if it is supplied with an empty, zero length,* or whitespace-only string. documented** @param str* @return*/
public static boolean isEmptyString(String str) {return (str == null) || (str.trim().length() == 0);
}public static boolean isEmptyNull(String str) {return "null".equals(str);
}/*** 判断一个数组元素是否为空 return true if it is supplied with an empty, zero length, or* whitespace-only string. documented** @param //str* @return*/
@SuppressWarnings("rawtypes" )
public static boolean isEmptyArray(List list) {return (list == null) || (list.size() == 0);
}/*** 将String数组转换成Integer数组** @param s* @return*/
public static Integer[] convertToIntegerArray(String[] s) {Integer[] num = new Integer[s.length];for (int i = 0; i < s.length; i++) {num[i] = new Integer(s[i]);}return num;
}/*** 将字符串数组转换成字符串** @param str* @return*/
public static String arrayToString(String[] str) {if (str == null)return "" ;StringBuffer sb = new StringBuffer();for (int i = 0; i < str.length; i++) {sb.append(str[i]);sb.append(", " );}return sb.toString();
}// 判断字符串是否存在于指定的字符串数组中
public static boolean isExist(String str, String[] array) {boolean result = false;if (array == null)return result;for (int i = 0; i < array.length; i++) {if (str.equals(array[i]))result = true;}return result;
}/*** 右对齐填充字符** @param data* @param length* @param fill* @return*/
public static String rightAlign(String data, int length, String fill) {for (int i = data.length(); i < length; i++) {data = fill + data;}return data;
}/*** 左对齐填充字符** @param data* @param length* @param fill* @return*/
public static String leftAlign(String data, int length, String fill) {for (int i = data.length(); i < length; i++) {data = data + fill;}return data;
}/*** MD5转换** @param plainText* @return MD5字符串*/
public static String toMD5(String plainText) throws NoSuchAlgorithmException {MessageDigest messageDigest = MessageDigest.getInstance("MD5" );messageDigest.update(plainText.getBytes());byte by[] = messageDigest.digest();StringBuffer buf = new StringBuffer();int val;for (int i = 0; i < by.length; i++) {val = by[i];if (val < 0) {val += 256;} else if (val < 16) {buf.append("0" );}buf.append(Integer.toHexString(val));}return buf.toString();
}public static boolean isEqualString(String arg0, String arg1) {return arg0.trim().equals(arg1.trim());
}/*** String转换成String数组 并对第一个元素赋值** @param arg* @return*/
public static String[] stringToStringArray(String arg) {String[] strArr = new String[1];strArr[0] = arg;return strArr;
}/*** 格式化字符串** @param arg* @param objects* @return*/
public static String formatterString(String arg, Object... objects) {return MessageFormat.format(arg, objects);
}
/*** @Function: 将map转换为xml* @author:   YangXueFeng* @Date:     2019/6/19 11:32*/
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();
}}

第三步

复制代码,喝茶休息

微信支付网页二维码NATIVE相关推荐

  1. 关于微信支付(二维码支付)

    关于微信支付(一) 微信支付有两种方式 1.第三方网站弹出二维码客户扫描支付 2.在微信内部H5直接发起支付 这篇文章先讲 第一种最常用的 弹出二维码支付 二维码支付 大概流程如下 用户选择支付-&g ...

  2. 微信支付--商户二维码支付(JAVA)

    先创建Springboot项目 已上传至github库 https://github.com/gaoruiqiang2017/weixinpay.git pom文件添加依赖 <!--微信支付SD ...

  3. 微信电脑网页二维码扫描登录简单实现

    补充: 从后台看到,好像很多非技术人员从搜索引擎收到本博客,好像目的是因为不知道网页版的微信登录地址.这里提供一下. https://wx.qq.com/   点击链接,用手机微信扫描一下就可以登录了 ...

  4. python头像变二维码_Python 图像处理库 pillow,提取支付宝和微信支付图片二维码...

    下面就是微信支付的收款二维码: 有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件,但图片处理软件不利于批处理,且学习也需要一定成本.本文将教你使用 Pytho ...

  5. 微信支付链接二维码生成

    1.进入composer官方网站,搜索phpqrcode安装包 composer命令安装 composer require aferrandini/phpqrcode 生成二维码图片的公共方法: // ...

  6. 微信支付,二维码图片解析

    微信支付: 后台返回的是数据流: 开始这样,但是不行, 解决:在请求里面加入 'responseType': 'blob' , 转换:附上base64转图片 //base64转换base64Imgto ...

  7. 微信二维码支付支付宝二维码支付(主扫模式)开发指南

    微信二维码支付 熟悉微信支付全家桶的童鞋应该都清楚,微信支付是没有提供PC网关支付的,那么传统的网站需要怎么接入微信支付产品呢? 我们可以选择微信支付中的Native支付产品,官方介绍: Native ...

  8. 微信支付宝收款二维码还能用吗?权威解读

    自央行发布<中国人民银行关于加强支付受理终端及相关业务管理的通知(银发[2021]259号)>以来,引起网友的热烈讨论,同时我们也陆续收到很多客户的咨询. 所以今天我们收集了各个渠道的官方 ...

  9. chroom浏览器网页二维码生成功能的方法

    谷歌浏览器二维码生成功能 在没有二维码的时候,我们如果要将电脑网页端的内容分享到移动端时,通常会复制内容,然后在粘贴到第三方通讯工具(微信.QQ)上发送给手机 其实早在Chrome85桌面端就上线网页 ...

最新文章

  1. 关于SQL Server中索引使用及维护简介
  2. 为什么工作时间长了。技术反而变低了。
  3. 关于JavaScript,这10条血与泪的建议大家一定要看
  4. 用python连接数据库_用Python连接MySQL
  5. 比特币的原理及运作机制
  6. 消费者服务消费延时分析
  7. JDBC是什么?和JDBC程序的基本编写
  8. Unity3D性能优化
  9. 【面包板电子制作130例仿真】简单变调电子门铃
  10. libreelec投屏_我的NAS+HTPC折腾之旅 篇八:LibreELEC部署媒体中心服务器emby和jellyfin篇...
  11. Ansible中的jinjia2模板
  12. set的用法及短语_set的短语
  13. 黑客第二课:脱屌第一步(主要讲unix-like系统的初步知识)
  14. vue2+Ts+elementUI_后台管理系统_Excel文件的上传下载
  15. Python实现1-100猜数字游戏
  16. idea output 窗口悬浮
  17. 英语六级高频词汇速记 + 2019-12-1听力 Day07
  18. 图像特征提取算法:加速鲁棒特征SURF
  19. 一款简单的声控报警电路
  20. 最简单的分压和低频滤波电路

热门文章

  1. 肌肉型小腿的瘦腿方案
  2. sybase用户权限管理3 _角色授予
  3. debian下配置网络 安装无线网卡驱动 Broadcom BCMXX系列
  4. JavaScrip 基础 第三篇
  5. VS2008调试时出现 0x75fcb727 处最可能的异常: 0x000006BA: RPC 服务器不可用的解决办法
  6. Least Recently Use(LRU的简单实现)
  7. YARN 作业 Staging目录的用途及配置
  8. 【c语言】输入身份证 输出年月日
  9. CC2640之TIRTOS添加IIC配置
  10. 计算机控制技术直流电机调速matlab,直流电机调速计算机控制关键技术专业课程设计.doc...