完整的微信小程序支付开发记录(亲测)

2023-10-27

这次呢是开发小程序的支付功能。因为没有做过,特此记录,做一个小总结,以便以后使用以及给小伙伴们提供一个像我一样的小白一个参考,我也是一点一点摸索过来的,此文只针对开发支付流程而言以及出现的问题,其它则会略过,只讲解实际动手开发过程 ,
名词和实际开发API看 开发文档
而我用的是普通模式

在这里插入图片描述

前期准备

1.开通微信支付平台 成为普通商户,上传商户所需信息(这个不用我多说)
2.配置小程序,获取appId (小程序项目也和支付无关,只需小程序的appId ,其它不表)
3.小程序appId 关联绑定商户支付平台 ,如图:
在这里插入图片描述

4.微信支付平台(简称平台)设置密钥,(密钥就是签名时要用的 key) 如图:
在这里插入图片描述
然后进入正题,首先服务器后端项目需要加入依赖:

<!-- 微信支付API -->
	<dependency>
		<groupId>com.github.wxpay</groupId>
		<artifactId>wxpay-sdk</artifactId>
		<version>0.0.3</version>
	</dependency>

以上的依赖官方已经封装了支付的方法及工具,使用起来很是方便,完全不用从基础一步一步根据API 封装实现。省了我们不少麻烦和繁琐。

也可以从支付平台下载SDK和demo对比,查看具体的内容, 其内容和依赖是一样的。
如图:

在这里插入图片描述

现在开始看代码,虽然封装了一些方法,但是项目还是需要配置一下自己的东西,比如appid 、商户号以及key 的配置,

package com.xn.weixin.common;

import java.io.ByteArrayInputStream;
import java.io.InputStream;

import com.github.wxpay.sdk.WXPayConfig;

//  需要实现一下支付基本的配置,方便调用
	public class MyPayConfig implements WXPayConfig{

			private byte[] certData;

			public void MyConfig() throws Exception {
					//此处暂时用不到,这里是读取证书的地方
			}

		    public String getAppID() {
		        return "这里是你的appid";
		    }
		
		    public String getMchID() {
		    //申请普通商户时分配给你的商户号
		        return "这里是你的商户号";
		    }
		
		    public String getKey() {
		    //这里的key 就是你在支付平台设置的API密钥
		        return "这是就是你的Key了";
		    }
		
		    public InputStream getCertStream() {
		        ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
		        return certBis;
		    }
		
		    public int getHttpConnectTimeoutMs() {
		        return 8000;
		    }
		
		    public int getHttpReadTimeoutMs() {
		        return 10000;
		    }
}

接下来下一步,我们看API 文档中有下面几点:

商户系统和微信支付系统主要交互:

1、小程序内调用登录接口,获取到用户的openid,api参见公共api【小程序登录API】

2、商户server调用支付统一下单,api参见公共api【统一下单API】

3、商户server调用再次签名,api参见公共api【再次签名】

4、商户server接收支付通知,api参见公共api【支付结果通知API】

5、商户server查询支付结果,如未收到支付通知的情况,商户后台系统可调用【查询订单API】

按照这个顺序,我们的项目都准备好了,也就是第一步已经过了,我们现在正在从第二步开始,
小程序登录后 =openId 是必有的 所以登录后可以保存下获取的openId ,以方便以后 支付时使用;
在这里插入图片描述
注意:
appid必须为最后拉起收银台的小程序appid;
mch_id为和appid成对绑定的支付商户号,收款资金会进入该商户号;
trade_type请填写JSAPI;
openid为appid对应的用户标识,即使用wx.login接口获得的openid

登录后进入商品页面,选择商品后,点击支付button ,首先就是要统一下单或JSAPI 下单,完成这一步返回得到 prepay_id 参数值,后面调用支付API 要用到。

我们看一下我们需要用到哪些参数:
在这里插入图片描述
以下还有几个参数。大家可以自行看API ;
依赖中封装的就是这几个类;

在这里插入图片描述

微信支付 Java SDK

微信支付开发者文档中给出的API进行了封装。

com.github.wxpay.sdk.WXPay类下提供了对应的方法:

方法名 说明
microPay 刷卡支付
unifiedOrder 统一下单
orderQuery 查询订单
reverse 撤销订单
closeOrder 关闭订单
refund 申请退款
refundQuery 查询退款
downloadBill 下载对账单
report 交易保障
shortUrl 转换短链接
authCodeToOpenid 授权码查询openid
  • 注意:
  • 证书文件不能放在web服务器虚拟目录,应放在有访问权限控制的目录中,防止被他人下载
  • 建议将证书文件名改为复杂且不容易猜测的文件名
  • 商户服务器要做好病毒和木马防护工作,不被非法侵入者窃取证书文件
  • 请妥善保管商户支付密钥、公众帐号SECRET,避免密钥泄露
  • 参数为Map<String, String>对象,返回类型也是Map<String, String>
  • 方法内部会将参数会转换成含有appidmch_idnonce_strsign\_typesign的XML
  • 可选HMAC-SHA256算法和MD5算法签名
  • 通过HTTPS请求得到返回数据后会对其做必要的处理(例如验证签名,签名错误则抛出异常)
  • 对于downloadBill,无论是否成功都返回Map,且都含有return_codereturn_msg,若成功,其中return_codeSUCCESS,另外data对应对账单数据

所以接下来上面配置好的config 就可以用到了

package com.xn.weixin.controller;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayConstants.SignType;
import com.github.wxpay.sdk.WXPayUtil;
import com.xn.system.entity.User;
import com.xn.util.ResultObj;
import com.xn.weixin.common.MyPayConfig;

@RestController
@RequestMapping("/pay/")
public class PaymentController {

@RequestMapping("payment")
public Object getpayment(HttpServletRequest request,String totalfee,String tradeno) throws Exception {
//	获取到当前登录用户,因为这里我保存了openid , 方法大家可以自己处理,这里就不展示了
	User user = User.getCurrentUserInfo().getUser();
	//当前就是我们自己配置的支付配置。appid 商户号 key 什么的;
	MyPayConfig config = new MyPayConfig(); 
	//当前类是官方为我们封装的一些使用的方法
    WXPay wxpay = new WXPay(config);
    //获取到 IP 
    String clientIp = getIpAddress(request);
	System.err.println(clientIp);
	//封装请求参数 参数说明看API文档,当前就不进行讲解了
    Map<String, String> data = new HashMap<String, String>();
    data.put("body", "腾讯充值中心-QQ会员充值");
    data.put("out_trade_no", "2016090910595900000012");
    data.put("device_info", "12345679"); //此处设备或商品编号
    data.put("fee_type", "CNY");  // 货币类型  人民币
    
     // 支付中没有小数点,起步以分做为单们,当前为1 分钱,所以自行调整金额 ,这里可以做为传参,
     //选取商品金额传到后端来
     data.put("total_fee", "1"); 
     
    data.put("spbill_create_ip", "123.12.12.123");
    data.put("notify_url", "http://www.example.com/wxpay/notify");
    data.put("trade_type", "JSAPI");  // 此处指定JSAPI
    data.put("product_id", "12");
    data.put("openid", “这是是登录获取到的openId  必传”);
    //调用统一下单方法
    Map<String, String> order = wxpay.unifiedOrder(data);
    //获取到需要的参数返回小程序
	return order;
	

}

// 获取 IP
public static String getIpAddress(HttpServletRequest request) {
	String ip = request.getHeader("x-forwarded-for");
	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
		ip = request.getHeader("Proxy-Client-IP");
	}
	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
		ip = request.getHeader("WL-Proxy-Client-IP");
	}
	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
		ip = request.getHeader("HTTP_CLIENT_IP");
	}
	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
		ip = request.getHeader("HTTP_X_FORWARDED_FOR");
	}
	if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
		ip = request.getRemoteAddr();
	}
	return ip;
}

}

大家可能要问了,为什么这里没有放入 appid 和 mchid 和 key,sign 签名
其实我们上面依赖中已经封装了,会自动获取到我们自己配置的 appid mchid 和key ,放入集合然后进行签名加密,下面看依赖中的方法:
在这里插入图片描述
我们找到这个方法看看具体内容:

/**
     * 作用:统一下单<br>
     * 场景:公共号支付、扫码支付、APP支付
     * @param reqData 向wxpay post的请求数据
     * @return API返回数据
     * @throws Exception
     */
    public Map<String, String> unifiedOrder(Map<String, String> reqData) throws Exception {
        return this.unifiedOrder(reqData, config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
    }

/**
 * 作用:统一下单<br>
 * 场景:公共号支付、扫码支付、APP支付
 * @param reqData 向wxpay post的请求数据
 * @param connectTimeoutMs 连接超时时间,单位是毫秒
 * @param readTimeoutMs 读超时时间,单位是毫秒
 * @return API返回数据
 * @throws Exception
 */
public Map<String, String> unifiedOrder(Map<String, String> reqData,  int connectTimeoutMs, int readTimeoutMs) throws Exception {
    String url;
    if (this.useSandbox) {
        url = WXPayConstants.SANDBOX_UNIFIEDORDER_URL_SUFFIX;
    }
    else {
        url = WXPayConstants.UNIFIEDORDER_URL_SUFFIX;
    }
    if(this.notifyUrl != null) {
        reqData.put("notify_url", this.notifyUrl);
    }
    String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
    return this.processResponseXml(respXml);
}

以上中最后第二行用到了这个方法 this.fillRequestData(reqData),其作用就是
向 Map 中添加 appid、mch_id、nonce_str、sign_type、sign ,
它自动为我们加密签名 发送请求,xml 转换map 等操作,我们只需要接收返回的数据再次调用小程序支付API 就可以了

	 /**
 * 向 Map 中添加 appid、mch_id、nonce_str、sign_type、sign <br>
 * 该函数适用于商户适用于统一下单等接口,不适用于红包、代金券接口
 *
 * @param reqData
 * @return
 * @throws Exception
 */
public Map<String, String> fillRequestData(Map<String, String> reqData) throws Exception {
    reqData.put("appid", config.getAppID());
    reqData.put("mch_id", config.getMchID());
    reqData.put("nonce_str", WXPayUtil.generateNonceStr());
    if (SignType.MD5.equals(this.signType)) {
        reqData.put("sign_type", WXPayConstants.MD5);
    }
    else if (SignType.HMACSHA256.equals(this.signType)) {
        reqData.put("sign_type", WXPayConstants.HMACSHA256);
    }
    reqData.put("sign", WXPayUtil.generateSignature(reqData, config.getKey(), this.signType));
    return reqData;
}

当我们小程序接收到服务器返回的参数数据,我们就可以再次调用wx.requestPayment(Object)发起微信支付。
统一下单返回的参数:

在这里插入图片描述

var data = {
		变量:金额什么的参数
}

	//小程序封装的post请求 
	action.post("请求url",“data参数”,function( res){
	//支付请求 但是此处有大坑,一定要注意,
	
	wx.requestPayment(
		{
		"timeStamp":"",
		"nonceStr": "",
		"package": "",
		"signType": "MD5",
		"paySign": "",
		"success":function(res){},
		"fail":function(res){},
		"complete":function(res){}
	})
	})

但是此处有大坑,一定要注意,
//api上说是只有五个参数 实际上还有一个 appid 需要加上,api 中也有说起过,但是发起支付api 示例上没有,一不注意就容易忽略掉,如果没有appid 总是报支付问题,这个需要你们自己测试了,我就不多加演示了

至此基本算是完结了,但是我刚开始发起这一步的时候总是出现 支付签名验证失败,怎么也过不去,卡了两天,后来我虽然做出来了,但是我还没有深入理解,我现在只能把改动的内容告诉你们,原理就需要同志们自己研究啦,

下面是几个小方法,调用比较方便:

	// 时间戳
timeStamp:function () {
  return parseInt(new Date().getTime() / 1000) + ''
},
/* 随机数 */
randomString:function () {
  var chars = 'A2345678';    
  var maxPos = chars.length;
  var pwd = '';
  for (var i = 0; i < 32; i++) {
    pwd += chars.charAt(Math.floor(Math.random() * maxPos));
  }
  return pwd;
},
  // 调起支付签名    这里我不太明白,虽然前面加载签名和后面验证,但里面加了随机数为什么验证还能通过我没还转过	      弯来,希望大家能搞明白吧,到时候可不要吝啬留言讲解一下下
MixedencryMD5:function (data,randomString,timeStamp) {
  var pay =  "appId=" + config.appid + "&nonceStr=" + randomString + "&package=prepay_id=" + data.prepay_id + 		  "&signType=MD5" + "&timeStamp=" + timeStamp+ "&key=" + config.key;  
  console.log(md5.hexMD5(pay))
  return  md5.hexMD5(pay);
},

完整的调用小程序支付:

changePayment:function(){
  var that = this;
  var fee = that.data.inputValue*100;
  //小程序封装的post请求 
	action.post("请求url",“data参数”,function( res){
	//支付请求 但是此处有大坑,一定要注意,
	
    //随机数  
    var randomString = that.randomString();
    //当前时间
    var time = that.timeStamp();
    //签名
    var parSigns = that.MixedencryMD5(res.data,randomString,time);
      wx.requestPayment({ 
        appId:config.appid,
        timeStamp: time,
        nonceStr: randomString,
        package: "prepay_id="+res.data.prepay_id,
        signType: "MD5",
        paySign: parSigns,
        success (ress) {
          console.log(ress)
        },
        fail (ress) {
          console.log(ress)
        }
      })
    
  })

到此小程序支付我已经完成了,并且成功支付,挺开心。
下面我再放一下效果图,然后本文就结束了,请大拿多多指教,有问题就评论区见吧

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

完整的微信小程序支付开发记录(亲测) 的相关文章

  • 内存不一致与线程交错有何不同?

    我正在编写一个多线程程序 正在研究是否应该使用volatile对于我的布尔标志 关于并发性的文档 oracle Trail 没有解释任何关于memory consistency errors以外 当不同的线程有内存一致性错误时 就会发生内存
  • 在java中切换imageIcon?

    我有很多在窗口中移动的平面 线程 我想根据平面的方向切换 ImageIcon 例如 如果飞机向右飞行 则飞机的 imageIcon 是向右的 然后飞机向左飞行 则将 imageIcon 交换为飞机向左 我怎样才能在方法paintCompon
  • 如何在 Spring 5 MVC 中将 FilePart 转换为 byte[]

    我有从网络表单接收和上传文件的控制器方法 如何从 FilePart 中提取字节数组并将其保存到数据库 我可以通过使用 FilePart transferTo 将 FilePart 保存到文件中来完成此操作 但这看起来又慢又难看 有更好的方法
  • Cassandra Pojo Sink Flink 中的动态表名称

    我是 Apache Flink 的新手 我正在使用 Pojo Sink 将数据加载到 Cassandra 中 现在 我在以下命令的帮助下指定表和键空间名称 Table注解 现在 我想在运行时动态传递表名称和键空间名称 以便可以将数据加载到用
  • ProcessBuilder 未正确执行 Java 类文件

    在一个java文件中 我调用命令行语句来执行另一个java文件 这就是我正在做的 List
  • 使用 Java 的 OpenId 提供者/服务器

    我正在尝试使用 OpenId 服务增强现有的 Java Web 应用程序 以便登录用户可以使用我的 Web 应用程序作为 OpenId 提供程序登录另一个启用 OpenId 的应用程序 My first attempt was to use
  • Tomcat:具有强密码的 TLSv1.2 不起作用

    我安装了Tomcat 7 配置了对 TLSv1 2 的支持在端口 8443 上 我的连接器配置 协议 org apache coyote http11 Http11NioProtocol SSLEnabled true 方案 https 安
  • javax.el.PropertyNotFoundException:在 java.lang.String 类型上找不到属性“tname”

    我之前使用的是 scriptlet 但现在我改用了 mvc 我无法检索 JSP 页面上的值并收到错误 javax el PropertyNotFoundException Property tname not found on type j
  • Spring的@PreDestroy导致随机记录而不记录

    我正在使用 Spring 并且在终止时我让 PreDestroy 清理 bean 我不明白为什么日志记录有时会成功 而有时会失败 Using Log4j2 Logger log LogManager getLogger MyClass cl
  • EDITLogBack Syslog 不工作 java

    我写了一个简单的项目来在 Ubuntu 中运行日志 方法如下example https examples javacodegeeks com enterprise java logback logback syslog example 应用
  • Java ZIP - 如何解压缩文件夹?

    是否有任何示例代码 如何将 ZIP 中的文件夹部分解压到我想要的目录中 我已将文件夹 FOLDER 中的所有文件读取到字节数组中 如何从其文件结构创建 我不确定你所说的部分是什么意思 您的意思是在没有 API 帮助的情况下自己完成吗 如果您
  • 测试 Hessian remoting-servlet.xml

    我们使用 Hessian 来实现富客户端和服务器之间的通信 由于移动和重命名 remoting servlet xml 中的条目有时会与实际的类名不匹配 因此 我正在寻找一种简单的方法来测试远程处理 xml 有没有简单的方法可以做到这一点
  • 在单独的模块中使用 Spring AOP 方面

    我在一个 Maven 项目模块中有一个方面 com x NiceAspect 在一个单独的 Maven 模块中有一个类 com x NiceClass 这些模块具有相同的 POM 父级 共同创建一个项目 我想要实现的目标是拥有一个通用的方面
  • 是否可以从 JBoss 容器中部署的所有 .war 文件中读取属性文件

    我已成功将 war 部署到 Jboss Web 容器 其中包含并读取位于 META INF groupid dir artifactid dir 下的 pom properties 为了访问该文件 我在同一 war 中的 JSP 中使用了以
  • 如何知道一个点是否在复杂的 3D 形状内(.ply 文件)

    我正在研究一个Java女巫项目真是要了我的命 经过几天在不同论坛上的研究 寻找我真正需要的东西 我来寻求你的帮助 我的数据 ply 文件 包含由许多三角形组成的 3D 形状 一个点 3D坐标 我想知道这个点是否包含在复杂的 3D 形状内 我
  • android中ScrollView中的图像

    在我的应用程序中 我想放置一个 png 文件 并且希望它在横向和纵向模式下都被视为滚动图像 请建议代码或示例 要使您的 Imageview 在高度不适合时滚动 您可以在 xml 中的 ScrollView 内添加一个 ImageView 并
  • java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException

    我想将 apache cli 添加到我的应用程序中 但我有问题 当我尝试运行它时显示这些错误 Error A JNI error has occurred please check your installation and try aga
  • 为什么ArrayList的非静态内部类SubList有一个成员变量“parent”?

    java util ArrayList SubList 是 java util ArrayList 的非静态内部类 这意味着它保存对其封闭类的引用 我们可以使用ArrayList this来访问java util ArrayList的成员
  • JAXB 枚举字段未序列化

    我有以下课程 package dictionary import java io Serializable import java util Objects import javax xml bind annotation XmlEleme
  • JAAS keytab 配置的相对路径

    我有一个系统 其中 NET 客户端使用 Kerberos 针对 Java 服务器进行身份验证 一切正常 但我正在尝试改进服务器配置 目前一个keytab根目录中需要文件C 因为我的jaas配置文件看起来像这样 Server com sun

随机推荐

  • 除了敲代码,程序员还能有什么副业?晓健韩品批发

    积极发展副业中 做韩妆一般贸易进口 跟集装箱通关的 仓库在山东烟台莱山区 做的比较大 价格方面有优势 有需要 可以私聊哈 正品是本分 xiaojian675050734 H19950211H
  • composer 中国镜像

    我的个人博客 逐步前行STEP 使用以下代码将packagist源更换为中国镜像 composer config g repo packagist composer https packagist phpcomposer com 或者 co
  • 【满分】【华为OD机试真题2023 JAVA&JS】不爱施肥的小布

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 不爱施肥的小布 知识点二分查找 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 某农场主管理了一大片果园 fields i 表示不同果林的面积 单位 m 2 现在
  • targetElement.closest

    在组件挂载时 给 document 添加点击事件监听 onMounted gt document addEventListener click closeIdentity 点击事件处理函数 用于改变 isExpanded 的值为 false
  • Lock wait timeout exceeded; try restarting transaction

    2016 08 05 09 21 52 com zhishi common controller BaseController ERROR Error updating database Cause com mysql jdbc excep
  • 教师怎样将成绩单独发送给学生和家长?

    在工作学习中 我们经常会遇到怎样将成绩单独发送给学生和家长这样的问题 因此 面对怎样将成绩单独发送给学生和家长我们应该有努力探索的精神 诚挚的心灵 是学生情感的钥匙 高尚的师德 是学生心灵的明镜 对于这个问题也是一样的 读书忌死读 死读钻牛
  • redhat7.6安装weblogic12c

    目录 一 环境准备 二 使用root创建用户和组 三 创建部署目录 四 上传安装包 五 创建 oraInst loc 文件 六 创建wls rsp 响应文件 七 进行安装 八 使用 wlst sh 离线模式创建一个域 九 启动服务 十 浏览
  • 电脑wps可以语音录入吗_怎样用word进行语音录入文字

    怎样用 word 进行语音录入文字 有时候我们不方便手敲键盘输入时 可以利用 word 的语音录入功能进行输入 以下是学习啦小编为您带来的关于用 Word 进行语音录入文字 希望对您有所帮助 用 Word 进行语音录入文字 语音输入功能添加
  • 最适合程序猿的笔记软件

    因为这几天小编要去听课 所以心血来潮找了几个适合程序猿的笔记软件 经过几天在csdn上的扒饭之后 我结合自己的某些要求 为大家整理出了这几个软件 有需要直接去后面找 一 必须支持markdown markdown的重要性不需要在这里多说了吧
  • TypeScript 联合类型(union type)

    TS是JS的超集 在JS的基础上添加了一套类型系统 这样的TS可以被静态分析带来的好处显而易见 let val string val 声明一个string类型的变量val let val string val val 1 Type numb
  • hive异常MetaException-Metastore contains multiple versions

    在执行hive运行脚本时 出现了MetaException Metastore contains multiple versions异常错误 Exception in thread main java lang RuntimeExcepti
  • Java 手动分页

    功能需求背景 今天负责短信后台定时任务时 需要定时向用户发送短信信息 但数据库记录的待发送记录数量比较大 无法一次查询出结果 需要手动分页 手动分页核心功能代码 Date now DateUtils getBeforeMouth new D
  • Arduino基本知识

    analogWrite 将一个模拟数值写进Arduino引脚 这个操作可以用来控制LED的亮度 或者控制电机的转速 Arduino每一次对引脚执行analogWrite 指令 都会给该引脚一个固定频率的PWM信号 digitalRead 读
  • 基于FPGA的图像采集之二 GEN_FRAME(成帧)模块

    距离上次的博客已经有段时间了 这写些日子一直在调SDRAM的模块以及文档的书写 SDRAM的子模块比较多 包括init 初始化模块 refresh 刷新模块 write 写模块 read 读模块 使用起来相比之前的USB控制模块 今天的GE
  • JAVA中队列,数据结构队列入队操作

    java中构造函数和构造方法的区别 Java中什么是构造函数 构造函数和普通函数的区别如下 1 写法上的不同 施工方法 Public modifier class 定义类的关键字 Test 类名 没有参数 测试 类名 接受一个参数 测试 类
  • 使用Visual Studio写一个简单的Windows窗体应用登录界面

    需要的知识 C 的基本语法 以及Visual Studio的基本操作方法 编辑软件 Sql Server 2017 Visual Studio 2017 前提 Sql Server 中有一个名为 MY LAPTOP 的服务器 一个名为 Te
  • 初学(9)——Hadoop错误:ssh: Could not resolve hostname master: Name or service not known

    进行ssh访问时出现错误 ssh Could not resolve hostname master Name or service not known 解决方法 修改hosts文件 将名称和IP建立联系 1 打开 etc目录下hosts文
  • 深入理解Go——context(2)

    文章目录 结构体 emptyCtx cancleCtx timerCtx valueCtx 结构体 emptyCtx 源码中定义了 Context 接口后 并且给出了一个实现 type emptyCtx int func emptyCtx
  • Spring Boot 实现各种参数校验

    目录 1 简单使用 1 引入依赖 2 requestBody参数校验 3 requestParam PathVariable参数校验 4 统一异常处理 2 进阶使用 1 分组校验 2 嵌套校验 3 集合校验 4 自定义校验 5 编程式校验
  • 完整的微信小程序支付开发记录(亲测)

    这次呢是开发小程序的支付功能 因为没有做过 特此记录 做一个小总结 以便以后使用以及给小伙伴们提供一个像我一样的小白一个参考 我也是一点一点摸索过来的 此文只针对开发支付流程而言以及出现的问题 其它则会略过 只讲解实际动手开发过程 名词和实