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

一个简单的微信小程序支付demo一个简单的微信小程序支付 demo wxml buttonbindta payment 支付 0 01js 在这里演示支付的过程 获取 openid 不做解释 payment function varthat this console log openid app globalData openid buttonbindta payment

一个简单的微信小程序支付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<>(); //微信分配的小程序ID reqParams.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) ); //终端IP reqParams.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)); //解析统一下单返回结果的xml Map<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成map Map<String, String> map = new HashMap<String, String>(); map = XMLUtil.doXMLParse(sb.toString()); String resXml = ""; System.out.println("接收到的报文:" + sb.toString()); // 过滤空 设置 TreeMap SortedMap<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 = " 
   
     " 
    + " 
   
     SUCCESS 
   " + " 
   
     OK 
   " + " "; } }else{ 
    resXml = " 
   
     " 
    + " 
   
     FAIL 
   " + " 
   
     报文为空 
   " + " "; } System.out.println(resXml); System.out.println("微信支付回调数据结束"); BufferedOutputStream out = new BufferedOutputStream( response.getOutputStream()); out.write(resXml.getBytes()); out.flush(); out.close(); } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218884.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午11:15
下一篇 2026年3月17日 下午11:15


相关推荐

  • Centeros常用命令

    Centeros常用命令常用命令1.su切换到管理员权限,输入密码2.cd/home进入到home文件夹3.touchlss0555创建文件夹lss05554.ls该目录的所有文件5.退出vim编辑模式ESC+ZZ6.tar-zxv-fxx.zip解压压缩文件7.mvxx….

    2025年7月14日
    3
  • spss k均值聚类_K均值法与系统聚类法的异同

    spss k均值聚类_K均值法与系统聚类法的异同总目录:SPSS学习整理SPSS实现快速聚类(K-Means/K-均值聚类)目的适用情景数据处理SPSS操作SPSS输出结果分析知识点目的利用K均值聚类对数据快速分类适用情景数据处理SPSS操作分析——分类——K-均值聚类最大迭代次数根据数据量,分类数量,电脑情况自己调整,能选多点就把上限调高点。SPSS输出结果分析在数据集最右两列保存了该个案的分类结果与到聚类中心的距离。由于没有自定义初始中心,系统设定了三个。迭代9次后中心值不变。最终个三个聚类中心以及他们

    2025年6月29日
    2
  • linux添加ufw规则,Ubuntu ufw防火墙规则顺序问题

    linux添加ufw规则,Ubuntu ufw防火墙规则顺序问题本文以 Ubuntu14 04 为例 讲讲 ufw 防火墙规则顺序问题 此处应该优雅的使用分割线先说原理再吐槽 Linux 系统及其许多其他软件中都有访问控制 AccessContro 功能 比如系统中的防火墙 Ciscoios 中的 ACL AccessContro

    2026年3月16日
    2
  • ffprobe的翻译

    ffprobe的翻译ffprobe 使用详解 2014 05 3122 27 38 分类 架构设计与优化目录 1 语法 2 描述 3 选项 3 1 流指示符 3 2 通用选项 3 3 音视频选项 3 4 主选项 4 写入器 4 1 默认值 4 2compact csv4 3flat4 4ini4 5json4 6xml5 Timecode

    2026年3月16日
    1
  • 如何在uReport2的SQL语句中添加查询参数并且访问报表页面

    如何在uReport2的SQL语句中添加查询参数并且访问报表页面nbsp nbsp nbsp nbsp nbsp nbsp nbsp 相信看过第二章 link uReport2 报表工具的基础使用及注意事项 的读者们应该对 uReport2 的基础操作会有所了解的 本章就开始讲述一下 如何在 uReport2 的 SQL 语句中添加查询参数并且访问报表页面 一 添加查询参数 nbsp nbsp nbsp nbsp nbsp nbsp nbsp 因为 uReport2 的编写入口支持表达式解析 不难想到可以用 的方式进行编写 当然 此处需要借助 param

    2026年3月20日
    3
  • java jsonarray string,java json字符串转JSONObject和JSONArray以及取值的实例「建议收藏」

    java jsonarray string,java json字符串转JSONObject和JSONArray以及取值的实例「建议收藏」javajson字符串转JSONObject和JSONArray以及取值的实例实现代码:importnet.sf.json.JSONArray;importnet.sf.json.JSONObject;publicclassJsonTest{publicstaticvoidmain(String[]args){StringjoStr=”{name:\”张三\”,age:…

    2022年5月12日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号