一个简单的微信小程序支付demo

//    .wxml
<button bindtap='payment'>支付 0.01</button>//   .js
//在这里演示支付的过程,获取openid不做解释
payment: function () {var that = this;
console.log('openid=' + app.globalData.openid);//请求后台发起支付,获取5个参数,data中放入支付的总额及其openid
//请求为示例
wx.request({url: 'https://服务器域名/****/wx_pay',
data: { openid: app.globalData.openid, money: "0.01" },
// method: 'POST',
// header: { "Content-Type": "application/json;charset=UTF-8"},
success: res => {console.log("服务端返回订单号");
if (res ) {//接受的5个参数,调用这个方法成功,微信就会弹出输入密码的界面
wx.requestPayment({timeStamp: res.data.data.timeStamp,
nonceStr: res.data.data.nonceStr,
package: res.data.data.package,
signType: res.data.data.signType,
paySign: res.data.data.paySign,success: payRes => {//支付成功后,可以做一些逻辑判断
console.log('支付成功!');
console.dir(payRes);
},
fail: payFail => {console.log('支付失败!');
console.dir(payFail);
}
})
} else {console.log('后台没有接受到5个参数');
}
},
fail: fail => {console.log('支付获取参数失败!');
console.dir(fail);
}
})
}@RequestMapping("wx_pay")
public Result<?> generateSignature(@RequestParam String openid , @RequestParam String money) throws Exception {Map<String, String> reqParams = new HashMap<>();//微信分配的小程序IDreqParams.put("appid",APPID);//微信支付分配的商户号reqParams.put("mch_id", MCH_ID);//随机字符串reqParams.put("nonce_str", WXPayUtil.generateNonceStr());//签名类型reqParams.put("sign_type", "MD5");//充值订单 商品描述reqParams.put("body",  "-测试-充值订单-微信小程序");//商户订单号reqParams.put("out_trade_no", WXPayUtil.createBillNo() );//订单总金额,单位为分reqParams.put("total_fee", WXPayUtil.getMoney(money)  );//终端IPreqParams.put("spbill_create_ip", "127.0.0.1");//通知地址reqParams.put("notify_url", NOTIFY_URL);//交易类型reqParams.put("trade_type", "JSAPI");//用户标识      、openid(在接口文档中 如果交易类型设置成'JSAPI'则必须传入openid)reqParams.put("openid", openid);//第一次签名String sign = WXPayUtil.generateSignature(reqParams, MCHAPI_KEY);reqParams.put("sign", sign);/**  调用支付定义下单API,返回预付单信息 prepay_id*/String xmlResult = HttpUtil.doSSLPost(WxProgramPayConfig.UNIFIED_ORDER_URL, WXPayUtil.mapToXml(reqParams));//解析统一下单返回结果的xmlMap<String, String> result = WXPayUtil.xmlToMap(xmlResult);//返回状态码String return_code = (String) result.get("return_code");String return_Msg = String.valueOf(result.get("return_msg"));//预付单信息String prepay_id = result.get("prepay_id");/** 小程序调起支付数据签名*/Map<String, String> packageParams = new HashMap<String, String>();if(return_code == "SUCCESS" || return_code.equals("SUCCESS")){//返回的预付单信息packageParams.put("appId",APPID);//这边要将返回的时间戳转化成字符串,不然小程序端调用wx.requestPayment方法会报签名错误packageParams.put("timeStamp",  String.valueOf(WXPayUtil.getCurrentTimestampMs()));packageParams.put("nonceStr", WXPayUtil.generateNonceStr());packageParams.put("package", "prepay_id=" + prepay_id);packageParams.put("signType", "MD5");//再次签名,这个签名用于小程序端调用wx.requesetPayment方法String packageSign = WXPayUtil.generateSignature(packageParams, MCHAPI_KEY);packageParams.put("paySign", packageSign);logger.info("=======================第二次签名:" + packageSign + "=====================");return ResultGenerator.genSuccessResult(packageParams);}else{logger.info("支付返回状态码错误 ===>" + return_code);logger.info("支付返回状态码错误 ===>" + WXPayUtil.getMsg(return_code));return ResultGenerator.genSuccessResult(return_code);}}/*** 微信小程序支付成功回调函数* @param request* @param response* @throws Exception*/@ApiIgnore@RequestMapping("/WeChatNotify")public void weChatNotify(HttpServletRequest request,HttpServletResponse response) throws Exception {logger.info("【进入微信支付回调通知】");BufferedReader br = new BufferedReader(new InputStreamReader((ServletInputStream)request.getInputStream()));String line = null;StringBuilder sb = new StringBuilder();while((line = br.readLine())!=null){sb.append(line);}br.close();// 解析xml成mapMap<String, String> map = new HashMap<String, String>();map = XMLUtil.doXMLParse(sb.toString());String resXml = "";System.out.println("接收到的报文:" + sb.toString());// 过滤空 设置 TreeMapSortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();Iterator it = map.keySet().iterator();while (it.hasNext()) {String parameter = (String) it.next();String parameterValue = map.get(parameter);String v = "";if (null != parameterValue) {v = parameterValue.trim();}packageParams.put(parameter, v);}String returnCode = (String) map.get("return_code");if("SUCCESS".equals(returnCode)){//验证签名是否正确if (PayCommonUtil.isTenpaySign("UTF-8", packageParams, MCHAPI_KEY)) {// 这里是支付成功/**此处添加自己的业务逻辑代码start**/
//                          String mch_id = (String) packageParams.get("mch_id");
//                          String openid = (String) packageParams.get("openid");String out_trade_no = (String) packageParams.get("out_trade_no"); //订单号
//                          String prepay_id = (String) packageParams.get("prepay_id");Integer total_fee = Integer.parseInt((String)packageParams.get("total_fee"));String attach = (String)packageParams.get("attach"); //商家数据包,原样返回------扩展字段
//                          JSONObject json = JSON.parseObject(attach);
//                          String notifyUrl = json.getString("notifyUrl");//                         /**此处添加自己的业务逻辑代码end**///通知微信服务器已经支付成功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> ";}System.out.println(resXml);System.out.println("微信支付回调数据结束");BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());out.write(resXml.getBytes());out.flush();out.close();}

一个简单的微信小程序支付demo相关推荐

  1. 小程序服务器搭建前后端交互,手把手带你搭一个简单的微信小程序(包括前后端)...

    开发小程序除了大家能看到的客户端,前端小程序是如何与后端服务器进行数据交互的呢? 本文将通俗易懂的讲一下.这里以nodejs为例来进行讲解 1.首先要在服务器上安装nodejs服务器: ​ wget ...

  2. 微信小程序开源Demo精选

    微信小程序开源Demo精选 原文:微信小程序开源Demo精选 1. 仿QQ应用程序(#社交 #聊天 #SNS) 地址:https://github.com/xiehui999/SmallAppForQ ...

  3. 目前为止最全的微信小程序项目实例 --- demo锦集

    wx-gesture-lock  微信小程序的手势密码 WXCustomSwitch 微信小程序自定义 Switch 组件模板 WeixinAppBdNovel 微信小程序demo:百度小说搜索 sh ...

  4. 微信小程序asp服务器架设,asp写的微信小程序支付demo-服务器端是asp+mdb的

    这个微信小程序支付demo代码是我用asp写的,微信小程序端加上服务器端用的asp和mdb数据库,下面是代码分享: 订单说明:{{paydata.title}} 支付金额:分 支付 --------- ...

  5. node微信小程序支付验证

    Node 微信支付验证 说明 业务流程 支付验证 辅助方法 结束 说明 之前写了一个,单纯的微信小程序支付的接口,这篇介绍一下支付完之后如何验证. 业务流程 支付验证 我们之前支付的时候有一个参数 n ...

  6. 超级简单thinkphp微信小程序服务商分账。以及小程序普通支付,微信特约商户

    产品介绍 服务商分账,主要用于服务商帮助特约商户完成订单收单成功后的资金分配. 使用场景举例 1.服务商抽成 在各个行业中,服务商为特约商户提供增值服务,服务商与特约商户协商,可以从特约商户的交易流水 ...

  7. 微信小程序支付【官方demo使用手记】——支付签名验证错误,total_fee 不能为空

    场景:统一下单成功,微信小程序支付报错--签名验证错误. 从微信支付文档,下载的demo.用与改造成小程序支付,统一下单成功后,小程序调用报错: --签名验证错误. 解决:修改微信签名算法的配置:为M ...

  8. php做一个微信退款,php如何实现微信小程序支付及退款

    微信小程序支付的主要逻辑集中在后端,前端只需携带支付所需的数据请求后端接口然后根据返回结果做相应成功失败处理即可. 支付步骤前端请求支付 后端请求微信服务器 后端接受微信服务器返回数据 前端发起支付 ...

  9. 微信小程序支付(1)Uni-app平台API接口

    uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.Web(响应式).以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝).快 ...

  10. 微信小程序支付流程(新手教程)

    微信小程序支付流程: 一.前期申请准备工作 1.小程序注册,要以公司的以身份去注册一个小程序,才能开通微信支付权限: 个人申请的小程序是不具备"微信支付"功能的! 但个人小程序可以 ...

最新文章

  1. feign调用走不走网关全局拦截_feign服务端出异常客户端处理的方法
  2. Windows10~python和tensorflow配置
  3. defaultdict python_python中defaultdict的用法详解
  4. Python全栈工程师(多继承、函数重写)
  5. 在html中取消或加上超链接的下划线
  6. 17电大计算机网考模拟题,2017年电大 201717统考电大计算机应用基础网考试题.doc...
  7. SAP Cloud for Customer的跳转链接制作navigation link
  8. e3是合法浮点数吗_下列哪些是不合法的浮点数的选项是 123 2e4.2 .e5 -e3 .234 1e3
  9. 【ZOJ - 3211】Dream City (01背包类问题,贪心背包)
  10. BAT文件命名中含有英文括号运行出错
  11. 33 windows_33_Proc_windows_job 进程,windows作业
  12. 找不到文件或程序集名称“DreamweaverCtrls”的解决方法
  13. CADD课程学习(6)-- 获得已有的虚拟化合物库(Drugbank、ZINC)
  14. 对LNode*与LinkLinst等价却不等用的理解
  15. 液冷技术或成服务器散热未来趋势
  16. Filecoin矿商史上最全测评,看完这篇谁也坑不了我
  17. 华为服务器如何登录修改密码,服务器登录修改密码
  18. Ajax(跨域请求)
  19. 国内B端竞品调研网站一网打尽
  20. Oracle数据库基础知识+sql语句练习

热门文章

  1. 软件研发软件基础设施的建设
  2. 对高级程序设计语言的基本理解
  3. FinalData的快速扫描
  4. 磁盘分区 如何分出整数
  5. 兰州大学计算机基础在线考试,[兰州大学]《计算机基础》2020年5月考试在线考核试题...
  6. Ubuntu 16.04 安装monaco字体
  7. 360se html怎么删除,如何卸载360浏览器?怎么彻底删除360浏览器?
  8. mvc新增,上架及下架
  9. 基于三维冲击波的变分理论--交通运输工程(一)
  10. 锋利的jQuery(汇总)