微信扫码支付-----适合初学者
微信支付整了两天,看了很多文档,没整太明白!其实一个技术的懂与不懂,无非就在于一个关键点你有没有搞明白,明白了就豁然开朗!也曾尝试着去看过源码,但是一头雾水,建议先把源码放进idea里打开,浏览README.md文件,很详细,但代码微信一直未更新!
微信老代码WXPayConfig还是接口实现,现在已经是抽象类了
如果是第一次做这块的业务,个人建议还是得将微信提供的开发文档结合README.md文件看一遍,最起码你的把参数整明白,README.md文件内有代码示例,弄明白统一下单,其他也就那样了。
微信支付是通过xml的形式交互的,所以记得将map转换成xml,官方提供有工具类
扫码支付简单来说就是后台调用微信的统一下单的方法,该方法会返回你一串codeurl,此codeurl返给前端,生成二维码由此支付!支付成功后,微信会通过回调地址访问访问你的接口发送支付成功或失败,前端开始轮循请求支付结果,也可以主动调用查询订单的方法,以确保订单支付成功!
以下代码均是测试阶段有很多不足待优化=====直接用也可以,但是得根据个人项目代码进行优化!如有问题请留言,共同学习!
pom.xml 引入maven依赖
<!-- https://mvnrepository.com/artifact/com.github.wxpay/wxpay-sdk -->
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
首先实现WXPayConfig
关键点 就三个 appid(小程序id)、mchid(商户号)、key(秘钥)
这三个是在申请微信支付时微信返给你的信息,还有一个证书,扫码支付不需要证书
package rongheng.member.config;
import org.springframework.context.annotation.Configuration;
import java.io.*;
@Configuration
public class WXPConfig implements com.github.wxpay.sdk.WXPayConfig {
private byte[] certData;
public WXPConfig() throws Exception {
/** 加载证书 这里证书需要到微信商户平台进行下载,在服务器的证书路径*/
/*String certPath = "cert/wxpay/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();*/
}
/*小程序id*/
@Override
public String getAppID() {
return "=======";
}
/*商户号*/
@Override
public String getMchID() {
return "=====";
}
/*秘钥*/
@Override
public String getKey() {
return "======";
}
@Override
public InputStream getCertStream() {
ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
return certBis;
}
@Override
public int getHttpConnectTimeoutMs() {
return 8000;
}
@Override
public int getHttpReadTimeoutMs() {
return 10000;
}
}
实现统一下单,支付回调,查询订单
package rongheng.member.controller;
import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayConstants;
import com.github.wxpay.sdk.WXPayUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import rongheng.member.config.WXPConfig;
import rongheng.member.entity.Orders;
import rongheng.member.service.pc.OrderService;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
@CrossOrigin(origins = "*")
@RestController
@Api(value = "微信扫码支付")
@RequestMapping(value = "/api/wxpay",method = RequestMethod.GET)
public class WXPayController {
@Resource
private WXPConfig wxpConfig;
@Resource
private OrderService orderService;
@ApiOperation("统一下单")
@RequestMapping(value = "/createqccode/{onlineNumber}",produces = "application/json")
public Map<String,String> createqccode(@PathVariable String onlineNumber) throws Exception{
Map<String,String> data = new HashMap<>();
/*根据订单号查询订单*/
Orders orders = orderService.queryOrdersById(onlineNumber);
if (orders == null){
data.put("401","请确认订单号");
return data;
}
WXPay wxPay = new WXPay(wxpConfig);
/*商品描述*/
data.put("body", "订单支付");
/*商户订单号*/
data.put("out_trade_no", onlineNumber);
/*设备号--暂时不用*/
//data.put("device_info", "");
/*货币类型--人民币*/
data.put("fee_type", "CNY");
/*订单总金额,单位为分*/
data.put("total_fee", "1");
/*调用微信支付API的机器IP*/
data.put("spbill_create_ip", "123.12.12.123");
/*异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数*/
//测试阶段可以利用花生壳这个工具,做一个内网穿透,映射你本地ip
data.put("notify_url", "http://www.example.com/wxpay/notify");
// 此处指定为扫码支付 JSAPI 公众号支付 NATIVE 扫码支付
data.put("trade_type", "NATIVE");
/*trade_type=NATIVE时,此参数必传。此参数为二维码中包含的商品ID,商户自行定义*/
data.put("product_id", orders.getOrderid());
/*小程序支付需要传openid*/
//data.put("openid","oAN2l5MrWaT0vjaOv6u_ZYKxbYRE");
//调用统一下单方法
Map<String, String> resp = wxPay.unifiedOrder(data);
System.out.println("======================"+resp.get("code_url"));
//以下参数可以想看微信支付文档成功或失败后返回的具体参数含义
if (resp.get("return_code").equals(WXPayConstants.SUCCESS)){
if (resp.get("result_code").equals(WXPayConstants.SUCCESS)){
Map<String,String> result = new HashMap<>();
result.put("onlineNumber",orders.getOnlineNumber());
result.put("orderAmount",orders.getOrderAmount());
result.put("codeUrl",resp.get("code_url"));
return result;
}else {
Map<String,String> map = new HashMap<>();
map.put(resp.get("err_code_des"),"1000001");
return map;
}
} else {
Map<String,String> map = new HashMap<>();
map.put(resp.get("return_msg"),"1000002");
return map;
}
}
/*支付回调*/
@ApiOperation("支付回调")
@RequestMapping(value = "notify" )
public void paymentCallback(HttpServletRequest request, HttpServletResponse response) throws Exception{
try {
/*先从请求读取数据*/
InputStream inputStream = request.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
StringBuilder builder = new StringBuilder();
String s = null;
while ((s = in.readLine()) != null){
builder.append(s);
}
in.close();
inputStream.close();
/*把xml格式的响应结果转换成map*/
Map<String,String> payResult = WXPayUtil.xmlToMap(builder.toString());
System.out.println("====================="+payResult);
WXPay wxPay = new WXPay(wxpConfig);
/*返回结果验证签名*/
boolean flag = wxPay.isResponseSignatureValid(payResult);
System.out.println("=========flag============"+flag);
if (flag){
String returnCode = payResult.get("return_code");
System.out.println("=========return_code============"+returnCode);
if (WXPayConstants.SUCCESS.equals(returnCode)){
String resultCode = payResult.get("result_code");
System.out.println("=========resultCode============"+resultCode);
if (WXPayConstants.SUCCESS.equals(resultCode)){
String onlineNumber = payResult.get("out_trade_no");
Orders orders = orderService.queryOrdersById(onlineNumber);
if (orders != null){
if (Integer.parseInt(payResult.get("total_fee")) == Integer.parseInt(orders.getOrderAmount() )){
/*微信支付单号*/
String transactionId = payResult.get("transaction_id");
System.out.println("==========transactionId============"+transactionId);
Map<String,String> reply = new HashMap<>();
reply.put("return_code","SUCCESS");
reply.put("return_msg","OK");
response.setContentType("application/xml;charset=utf-8");
PrintWriter printWriter = response.getWriter();
printWriter.print(WXPayUtil.mapToXml(reply));
printWriter.flush();
printWriter.close();
}
}
}
}
}
}catch (Exception e){
e.printStackTrace();
}
}
/*订单查询*/
@ApiOperation("订单查询")
@RequestMapping("orderQuery")
public Map<String,String> orderQuery(String onlineNumber){
WXPay wxPay = new WXPay(wxpConfig);
Map<String,String> data = new HashMap<>();
data.put("out_trade_no",onlineNumber);
try {
Map<String,String> resp = wxPay.orderQuery(data);
/*在return_code 、result_code、trade_state都为SUCCESS时有返回*/
if (resp.get("return_code").equals("SUCCESS")){
if (resp.get("result_code").equals("SUCCESS")){
if (resp.get("trade_state").equals("SUCCESS")){
/*商户订单号*/
data.put("out_trade_no",resp.get("out_trade_no"));
/*支付时间*/
data.put("time_end",resp.get("time_end"));
/*微信支付订单号*/
data.put("transaction_id",resp.get("transaction_id"));
/*支付金额*/
data.put("total_fee",resp.get("total_fee"));
return data;
}else {
data.put(resp.get("return_msg"),"2000001");
return data;
}
}else {
data.put(resp.get("return_msg"),"2000002");
return data;
}
}else {
data.put(resp.get("return_msg"),"2000003");
return data;
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
}
本文来自博客园,作者:好事的猫,转载请注明原文链接:https://www.cnblogs.com/BeiJiuGuRen/p/15828596.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)