微信小程序+微信支付+java后台(springboot)使用的是微信官方支付SDK(附代码)
时间:2018-12-20
本文章向大家介绍微信小程序+微信支付+java后台(springboot)使用的是微信官方支付SDK(附代码),主要包括微信小程序+微信支付+java后台(springboot)使用的是微信官方支付SDK(附代码)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
刚开始做,网上找了很多,下载了三个demo,最后发现,这玩意还是需要个干货!
讲重点:
1.下载微信官方的SDK
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
选择下载java版本最佳实践。
2.将以下文件拷到你的项目中
3.在同文件夹下创建此继承类
package com.***.utils.wx;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
/**
* @Description: 微信支付配置类
* @Author: hm
* @CreateDate: 2018/12/10 17:19.
* @UpdateDate: 2018/12/10 17:19.
* @Version: 1.0
*/
public class MyConfig extends WXPayConfig {
private byte[] certData;
public MyConfig() throws Exception {
// String certPath = "classpath:apiclient_cert.p12";
// File file = new File(certPath);
// InputStream certStream = new FileInputStream(file);
// this.certData = new byte[(int) file.length()];
// certStream.read(this.certData);
// certStream.close();
}
@Override
public String getAppID() {
return "你的appid";
}
@Override
public String getMchID() {
return "你的商户id";
}
@Override
public String getKey() {
return "你的商户api安全key,在商户平台api安全目录下可设置";
}
@Override
public InputStream getCertStream() {
ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
return certBis;
}
@Override
public int getHttpConnectTimeoutMs() {
return 8000;
}
@Override
public int getHttpReadTimeoutMs() {
return 10000;
}
@Override
IWXPayDomain getWXPayDomain() {
return new IWXPayDomain() {
@Override
public void report(String domain, long elapsedTimeMillis, Exception ex) {
}
@Override
public DomainInfo getDomain(WXPayConfig config) {
return new DomainInfo("api.mch.weixin.qq.com", false);
}
};
}
}
4.java后台的调用统一下单接口类
/**
* 微信统一下单接口
* @return
*/
@RequestMapping(value = "/doUnifiedOrder", method = RequestMethod.POST)
public BaseResponse<Map> doUnifiedOrder(@RequestBody BaesRequest<LicensePlate> baseRequest) {
BaseResponse<Map> response = new BaseResponse<>();
Map resultMap=new HashMap();
String openid = baseRequest.getRequestData().getOpenId();
MyConfig config = null;
WXPay wxpay =null;
try {
config = new MyConfig();
wxpay= new WXPay(config);
} catch (Exception e) {
e.printStackTrace();
}
//生成的随机字符串
String nonce_str = WXPayUtil.generateNonceStr();
//获取客户端的ip地址
//获取本机的ip地址
InetAddress addr = null;
try {
addr = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
String spbill_create_ip = addr.getHostAddress();
//支付金额,需要转成字符串类型,否则后面的签名会失败
int total_fee=1;
//商品描述
String body = "车费支付";
//商户订单号
String out_trade_no= WXPayUtil.generateNonceStr();
//统一下单接口参数
HashMap<String, String> data = new HashMap<String, String>();
data.put("appid", appid);
data.put("mch_id", mch_id);
data.put("nonce_str", nonce_str);
data.put("body", body);
data.put("out_trade_no",out_trade_no);
data.put("total_fee", String.valueOf(total_fee));
data.put("spbill_create_ip", spbill_create_ip);
data.put("notify_url", notify_url);
data.put("trade_type",TRADETYPE);
data.put("openid", openid);
try {
Map<String, String> rMap = wxpay.unifiedOrder(data);
System.out.println("统一下单接口返回: " + rMap);
String return_code = (String) rMap.get("return_code");
String result_code = (String) rMap.get("result_code");
String nonceStr = WXPayUtil.generateNonceStr();
resultMap.put("nonceStr", nonceStr);
Long timeStamp = System.currentTimeMillis() / 1000;
if ("SUCCESS".equals(return_code) && return_code.equals(result_code)) {
String prepayid = rMap.get("prepay_id");
resultMap.put("package", "prepay_id="+prepayid);
resultMap.put("signType", "MD5");
//这边要将返回的时间戳转化成字符串,不然小程序端调用wx.requestPayment方法会报签名错误
resultMap.put("timeStamp", timeStamp + "");
//再次签名,这个签名用于小程序端调用wx.requesetPayment方法
resultMap.put("appId",appid);
String sign = WXPayUtil.generateSignature(resultMap, key);
resultMap.put("paySign", sign);
System.out.println("生成的签名paySign : "+ sign);
response.setData(resultMap);
return response;
}else{
return response;
}
} catch (Exception e) {
e.printStackTrace();
return response;
}
}
5.小程序端的支付请求
payNow: function() {
var that = this;
wx.request({
url: app.data.requestUrl + 'weChatPay/doUnifiedOrder',
header: {
"Content-Type": "application/json;charset=UTF-8"
},
data: {
requestData: {
openId: app.globalData.openId
}
},
method: 'POST',
dataType: 'json',
responseType: 'text',
success: function(res) {
console.log("服务端返回订单号");
var c=res.data;
wx.requestPayment({
timeStamp: res.data.data.timeStamp,
nonceStr: res.data.data.nonceStr,
package: res.data.data.package,
signType: 'MD5',
paySign: res.data.data.paySign,
success(res) {
console.log("统一下单接口成功");
},
fail(res) {
console.log("统一下单接口失败");
}
});
},
fail: function(res) {},
complete: function(res) {},
});
}
6.超简单支付过程,只需要修改配置文件中你自己的appid等信息就可以使用了。文中没有java后台的业务逻辑,可以自己添加,这里主要实现支付功能。(为了隐私,截图中屏蔽了主体信息。)
- Spring Boot 中使用 MongoDB 增删改查
- 来人啊给我炸了那个Java虚拟机No.46
- 机器学习虾扯淡之Logistic回归No.44
- 大数据计数原理1+0=1这你都不会算(一)No.47
- 机器学习虾扯蛋之SVD奇异值分解No.48
- 提高Spark姿势水平 No.73
- 好好玩的螺旋算法No.69
- linux学习第四十篇:访问日志不记录静态文件,访问日志切割,静态元素过期时间
- linux学习第四十一篇:配置防盗链,访问控制Directory,访问控制FilesMatch
- linux学习第四十二篇:限定某个目录禁止解析php, 限制user_agent,PHP相关配置
- 简易但不简单的配置中心No.79
- linux学习第四十三篇:LNMP架构介绍,mysql安装,php安装,Nginx介绍
- linux学习第四十四篇:Nginx安装,Nginx默认虚拟主机,Nginx域名重定向
- linux学习第四十二篇:PHP扩展模块安装
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Android编程实现定时发短信功能示例
- Android实现新浪微博一键分享的实例代码
- Android实现常见的验证码输入框实例代码
- Android实现加载状态视图切换效果
- Retrofit + OkHttp缓存处理的示例代码
- Android图片实现压缩处理的实例代码
- Windows10安装linux子系统的两种方式(图文详解)
- Android 图片处理避免出现oom的方法详解
- session登陆成功第四篇4
- Android编程使用pull方式解析xml格式文件的方法详解
- Android中ActionBar和ToolBar添加返回箭头的实例代码
- Android自定义双向进度条的实现代码
- android视频截屏&手机录屏实现代码
- Android自定义组件跟随自己手指主动画圆
- Android RecyclerView 实现快速滚动的示例代码