本周的工作安排就是在网站添加支付功能,包括支付宝、微信、财付通等,今天这篇文章先说一下微信支付吧,支付宝的太容易了基本看一下都会了

1、首先准备工作,开通了支付功能的账号,具体怎么开通的我也不熟悉因为我做的时候都是使用开通好的账号(目前微信支付好像只支持商家不支持个人吧?)

2、按照我的性格当然是百度一下啦,但是微信支付的文档说明事例实在是太坑了,完全不是我这种小白可以一下看懂的,在这夸奖一下支付宝,支付宝的事例文档做的太好了基本做的时候没什么坑

准备工作结束开工:

我的开发环境是java,所以去官方找代码不得不说太TM坑了 java版本的好像是维护的最不好的,人家其他的那么多

你看java的 不说了,没有扫码支付的,但是我这次使用的肯定是扫码啊 ,只好继续百度了。

找到了这个项目,是git上一个人维护的,我看了一下基本符合我的需求,就按照这个改吧

WxPayDto.java是微信发送消息的实体类

WxPayResult.java是接收到回调消息的实体类

具体的操作看下面:

具体的操作之前需要先得到几个必须的参数

  //微信支付商户开通后 微信会提供appid和appsecret和商户号partnerprivate static String appid = "";private static String appsecret = "";private static String partner = "";//这个参数partnerkey是在商户后台配置的一个32位的key,微信商户平台-账户设置-安全设置-api安全private static String partnerkey = "";//openId 是微信用户针对公众号的标识,授权的部分这里不解释private static String openId = "";//微信支付成功后通知地址 必须要求80端口并且地址不能带参数private static String notifyurl = "";

 参数什么的都是直接客户提供给我的,你们如果是自己开发获取这些参数的时候可能不知道具体位置,我建议你百度一下因为如果参数都不知道怎么获取还谈什么开发接口啊

这里有几点需要说明一下的

openid我没设置 不知道是干什么 随便填了成了客户商户ID反正也没报错。

notifyurl 是交易成功后回调的地址,需要在公众账号的后台设置一下,否则即使交易成功返回信息也是错误的。

微信支付的步骤是 获取交易的二维码,这个二维码是通过你传入的商品ID 价格等信息 微信生成的,用户扫码后启动微信的支付客户端,支付成功后回调你设置的回调地址那第一步获取微信支付的二维码看代码:
   //扫码支付WxPayDto tpWxPay1 = new WxPayDto();tpWxPay1.setBody(gp.getPackname());tpWxPay1.setOrderId(of.getOrder_id());tpWxPay1.setSpbillCreateIp(request.getRemoteAddr());tpWxPay1.setTotalFee(gp.getFee());mv.addObject("txcode", getCodeurl(tpWxPay1));
       public String getCodeurl(WxPayDto tpWxPayDto){// 1 参数// 订单号String orderId = tpWxPayDto.getOrderId();// 附加数据 原样返回String attach = "";// 总金额以分为单位,不带小数点String totalFee = getMoney(tpWxPayDto.getTotalFee());// 订单生成的机器 IPString spbill_create_ip = tpWxPayDto.getSpbillCreateIp();// 这里notify_url是 支付完成后微信发给该链接信息,可以判断会员是否支付成功,改变订单状态等。String notify_url = notifyurl; String trade_type = "NATIVE"; // 商户号 String mch_id = partner; // 随机字符串 String nonce_str = getNonceStr(); // 商品描述根据情况修改 String body = tpWxPayDto.getBody(); // 商户订单号 String out_trade_no = orderId; SortedMap<String, String> packageParams = new TreeMap<String, String>(); packageParams.put("appid", appid); packageParams.put("mch_id", mch_id); packageParams.put("nonce_str", nonce_str); packageParams.put("body", body); packageParams.put("attach", attach); packageParams.put("out_trade_no", out_trade_no); // 这里写的金额为1 分到时修改 packageParams.put("total_fee", totalFee); packageParams.put("spbill_create_ip", spbill_create_ip); packageParams.put("notify_url", notify_url); packageParams.put("trade_type", trade_type); RequestHandler reqHandler = new RequestHandler(null, null); reqHandler.init(appid, appsecret, partnerkey); String sign = reqHandler.createSign(packageParams); String xml = "<xml>" + "<appid>" + appid + "</appid>" + "<mch_id>" + mch_id + "</mch_id>" + "<nonce_str>" + nonce_str + "</nonce_str>" + "<sign>" + sign + "</sign>" + "<body><![CDATA[" + body + "]]></body>" + "<out_trade_no>" + out_trade_no + "</out_trade_no>" + "<attach>" + attach + "</attach>" + "<total_fee>" + totalFee + "</total_fee>" + "<spbill_create_ip>" + spbill_create_ip + "</spbill_create_ip>" + "<notify_url>" + notify_url + "</notify_url>" + "<trade_type>" + trade_type + "</trade_type>" + "</xml>"; String code_url = ""; String createOrderURL = "https://api.mch.weixin.qq.com/pay/unifiedorder"; code_url = new GetWxOrderno().getCodeUrl(createOrderURL, xml); System.out.println("code_url----------------"+code_url); return code_url; }

设置好参数后直接调用getCodeurl()函数就能获取到微信的二维码了,如果返回的信息错误,可以断点跟踪一下看看
 code_url = new GetWxOrderno().getCodeUrl(createOrderURL, xml); 这句返回的具体错误信息。

如果这部成功的话,你应该会得到一个类似这样的地址:weixin://wxpay/bizpayurl?pr=eYaNVZF

在前台直接使用qrcode.js将这个地址生成二维码显示在页面上,我的前台页面代码是这样的
<!doctype html>
<html><head><title>扫码支付前台demo</title><meta name="keywords" content="关键字"><meta name="description" content="描述">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><script src=""></script><script src="http://localhost:8080/shopping/resources/newstyle/js/qrcode.js"></script></head><body><div align="center" id="qrcode"><p >扫码商品二维码付款<br><br></p></div></body><script>//这个地址是Demo.java生成的code_url,这个很关键var url = "weixin://wxpay/bizpayurl?pr=eYaNVZF"; //参数1表示图像大小,取值范围1-10;参数2表示质量,取值范围'L','M','Q','H' var qr = qrcode(10, 'M'); qr.addData(url); qr.make(); var dom=document.createElement('DIV'); dom.innerHTML = qr.createImgTag(); var element=document.getElementById("qrcode"); element.appendChild(dom); </script> </html>

接下来到了一个小技巧的提供时间了 ,由于微信的回调地址要求必须是80端口还必须是是外网的,咱们开发都是局域网而且也没有域名啊 ,怎么办?当然有办法了神器登场 ngrok如果你用的是原版的ngrok 他每次自动生成的二级域名都是随机生成的 ,这样会很麻烦因为每次都要修改微信的后台,后来又找到了一个国内的,不但不用FQ了还可以定制指定的二级域名http://natapp.cn/ 去这网址,绝对比原版的好用这是我本机的参数配置,zy是二级域名,8080端口是我的resin的启动地址,这样我就可以使用http://zy.ngrok.natapp.cn这样的域名来访问我的本机网站了ngrok -config ngrok.cfg -subdomain  zy 8080回调地址直接配置成:http://zy.ngrok.natapp.cn/你的处理回调页面.jsp这样就可以实现在本机的调试,这东西我是找了好几个小时才发现的 ,真心的好用啊以后微信的相关接口开发都可以使用这个啊

接下来就是接受微信的回调页面了可以说的不多直接上代码
       @RequestMapping({"/notifyurl.htm"})public void notifyurl(HttpServletRequest request, HttpServletResponse response) throws IOException {//把如下代码贴到的你的处理回调的servlet 或者.do 中即可明白回调操作System.out.print("微信支付回调数据开始");//示例报文//String xml = "<xml><appid><![CDATA[wxb4dc385f953b356e]]></appid><bank_type><![CDATA[CCB_CREDIT]]></bank_type><cash_fee><![CDATA[1]]></cash_fee><fee_type><![CDATA[CNY]]></fee_type><is_subscribe><![CDATA[Y]]></is_subscribe><mch_id><![CDATA[1228442802]]></mch_id><nonce_str><![CDATA[1002477130]]></nonce_str><openid><![CDATA[o-HREuJzRr3moMvv990VdfnQ8x4k]]></openid><out_trade_no><![CDATA[jdg_16042915230001]]></out_trade_no><result_code><![CDATA[SUCCESS]]></result_code><return_code><![CDATA[SUCCESS]]></return_code><sign><![CDATA[1269E03E43F2B8C388A414EDAE185CEE]]></sign><time_end><![CDATA[20150324100405]]></time_end><total_fee>1</total_fee><trade_type><![CDATA[JSAPI]]></trade_type><transaction_id><![CDATA[1009530574201503240036299496]]></transaction_id></xml>";String inputLine;String notityXml="" ;String resXml = ""; try { while ((inputLine = request.getReader().readLine()) != null) { notityXml += inputLine; } request.getReader().close(); } catch (Exception e) { e.printStackTrace(); } System.out.println("接收到的报文:" + notityXml); Map m = parseXmlToList2(notityXml); WxPayResult wpr = new WxPayResult(); wpr.setAppid(m.get("appid").toString()); wpr.setBankType(m.get("bank_type").toString()); wpr.setCashFee(m.get("cash_fee").toString()); wpr.setFeeType(m.get("fee_type").toString()); wpr.setIsSubscribe(m.get("is_subscribe").toString()); wpr.setMchId(m.get("mch_id").toString()); wpr.setNonceStr(m.get("nonce_str").toString()); wpr.setOpenid(m.get("openid").toString()); wpr.setOutTradeNo(m.get("out_trade_no").toString()); wpr.setResultCode(m.get("result_code").toString()); wpr.setReturnCode(m.get("return_code").toString()); wpr.setSign(m.get("sign").toString()); wpr.setTimeEnd(m.get("time_end").toString()); wpr.setTotalFee(m.get("total_fee").toString()); wpr.setTradeType(m.get("trade_type").toString()); wpr.setTransactionId(m.get("transaction_id").toString()); if("SUCCESS".equals(wpr.getResultCode())){ //支付成功 //加入支付成功业务逻辑 if(this.isczok(wpr.getOutTradeNo()))//判断该笔订单是否在商户网站中已经做过处理  { if(this.addusergoldandlog(wpr.getOutTradeNo()))//增加用户金币写入订单记录  { if(setorderstate(wpr.getOutTradeNo(),1)) { resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>" + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> "; } } else { resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[增加金币失败]]></return_msg>" + "</xml> "; } }else{ resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[订单已经处理过了]]></return_msg>" + "</xml> "; } } else { resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[微信返回结果错误]]></return_msg>" + "</xml> "; setorderstate(wpr.getOutTradeNo(),2);//讲订单状态更改成支付失败  } System.out.println("微信支付回调数据结束"); BufferedOutputStream out = new BufferedOutputStream( response.getOutputStream()); out.write(resXml.getBytes()); out.flush(); out.close(); } /** * description: 解析微信通知xml * * @param xml * @return * @author ex_yangxiaoyi * @see */ @SuppressWarnings({ "unused", "rawtypes", "unchecked" }) private static Map parseXmlToList2(String xml) { Map retMap = new HashMap(); try { StringReader read = new StringReader(xml); // 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入 InputSource source = new InputSource(read); // 创建一个新的SAXBuilder SAXBuilder sb = new SAXBuilder(); // 通过输入源构造一个Document Document doc = (Document) sb.build(source); Element root = doc.getRootElement();// 指向根节点 List<Element> es = root.getChildren(); if (es != null && es.size() != 0) { for (Element element : es) { retMap.put(element.getName(), element.getValue()); } } } catch (Exception e) { e.printStackTrace(); } return retMap; }

注意:接受到的都是xml格式的数据,腾讯的坑爹团队,都什么年代了还用xml

其中需要注意的是,如果交易成功后要在页面中直接返回

"<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> "我这个代码中的好像没成功,我准备再修改一下,你们谁知道应该怎么写的可以私信我想我这么写虽然交易成功,但是微信一直没收到你的反馈会一直异步请求你的页面,具体会请求多久我没看到文档里写,不过一般其他支付的也就是请求几次

这篇文章写的非常仓促,很多细节都没说到,等接下来有时间一定将文章好好整理一下
 



转载于:https://www.cnblogs.com/zy1411/p/5461491.html

网站添加微信支付功能(小白填坑)相关推荐

  1. vue 微信支付的坑_Vue实现微信支付功能遇到的坑

    微信支付功能相比较支付宝支付,有点点繁琐,整理记录下来,以便日后所需 项目用VUE+EL搭建而成,支付用EL的radio来做的 微信支付 推荐安装最新版微信使用 支付宝 推荐有支付宝账户的用户使用 坑 ...

  2. 为电子商务网站添加在线支付功能

    2019独角兽企业重金招聘Python工程师标准>>> 网页制作Webjx文章简介:为了方便买家们在网站购物时能够在线支付货款并有效提升网站档次,作为购物网站的站长有必要给网站增添在 ...

  3. 微信小程序中嵌套html_微信小程序:web-view嵌套H5实现微信支付功能解决方案及填坑...

    ab7117c7d4947210c39e126a01d23ede.jpg 最近一个多月加班比较严重,偶尔休息一天也是在补睡眠+陪家人,比较长时间没有来进行总结记录了.今天不加班,开始为这段时间做的东西 ...

  4. 1元云购微信支付功能开发 - 1元云购网站开发

    1元云购是时下比较流行的电子商务模式,1元云购系统现在在网上也比较多,但是大多数的网站建设源码是比较老的版本,要么就是没有微信支付功能,要么就是微信支付功能有缺陷,例如 1.微信支付的账户配置在程序里 ...

  5. VUE爬坑之----微信支付功能

    微信支付功能相比较支付宝支付,有点点繁琐,整理记录下来,以便日后所需 项目用VUE+EL搭建而成,支付用EL的radio来做的 <el-radio v-model="radio&quo ...

  6. 微信境外支付php_PHP实现 APP端微信支付功能

    前面已经写了手机APP支付宝支付,今天再把手机APP微信支付补上,前期的准备工作在这里就不多说了,可以参考微信支付开发文档,一定要仔细阅读开发文档,可以让你少踩点坑:准备工作完成后就是配置参数,调用统 ...

  7. java开发NATIVE微信支付功能(下单)

    ** 谈NATIVE微信支付流程以及遇到坑 初次接触微信支付,内心万马奔腾,产品,客户一直催,微信支付文档也不知道怎么看,记录一下微信支付开发步骤,,,,,先解释微信支付流程!其他文档会给加密,解密, ...

  8. 微信公众号开发,微信支付功能开发(网页JSAPI调用)

    1.微信支付的流程 如下三张手机截图,我们在微信网页端看到的支付,表面上看到的是 "点击支付按钮 - 弹出支付框 - 支付成功后出现提示页面",实际上的核心处理过程是: 点击支付按 ...

  9. 如何使用easywechat开发微信支付功能

    easywechat是神一样的存在.非常好用.希望大家都能转到这上面来. 用easywechat来开发微信支付功能,步骤如下: 一,需要有一个商品下单页面,页面上有你的商品的信息,还要有购买数量,和一 ...

最新文章

  1. nanoflann库
  2. spring react_使用Spring Cloud Gateway保护React式微服务
  3. 第 22 期:有序遍历语法
  4. arcpy 查看arcgis的产品类型、产品许可与安装信息
  5. 程序员同事被包工头坑了,这社会很魔幻
  6. Word vba 替换
  7. 冰点还原精灵破解版|冰点还原精灵中文破解版下载(附冰点还原精灵注册机及许可证密钥)
  8. 软件智能:aaas系统 后天八卦-aaas作为组织者的数据结构及其运行时
  9. RuntimeError: einsum(): operands do not broadcast with remapped shapes [original->remapped]
  10. 服务器被恶意攻击可以报警吗?
  11. Python爬虫面试简历 经验分析
  12. java俄罗斯方块七中图形类_用shell写俄罗斯方块
  13. pubmedy安装不聊了_安装这个,Pubmed就彻底封神了!
  14. Xcode自动打包和上传蒲公英平台脚本(用python实现)
  15. html登录错误有提示,为什么我登录之后的提示老是网页上有错误呢?
  16. cmd 切换到 指定目录
  17. vue脚手架实现留言板功能
  18. 电脑开不了机提示checking media的解决方法
  19. 复合字面量(compound literals)详解
  20. 查看浏览器的cookie

热门文章

  1. [错误总结]升级spring-boot->2.6.2|hiberate->5.4.33.Final|spring cloud->2021.0.0 |spring admin->2.4.1
  2. [深度学习-优化]梯度消失与梯度爆炸的原因以及解决方案
  3. Python中表示自然底数与浮点数精度(等效于MATLAB中eps)
  4. make、make是什么??
  5. 《Effective Approaches to Attention-based Neural Machine Translation》—— 基于注意力机制的有效神经机器翻译方法
  6. leetcode - 91. 解码方法
  7. 循环矩阵与傅里叶相关的几点性质
  8. IPC--进程间通信一(管道)
  9. 罗德里格斯(Rodrigues)旋转方程推导
  10. Spring线程池开发实战