微信扫码支付
2022-08-04 23:07:03 1395浏览
微信扫码支付
https://pay.weixin.qq.com/wiki/doc/api/index.html
进入官网
以用户扫描二维码支付为例

下载demo

注意微信支付需要证书(这个过程比较麻烦),这个需要去微信平台申请,先交年费300
修改代码
demo不能直接使用需要修改
将demo导入eclipse或者idea,如下

只有java文件,没有其他的,先来看看他的代码
wxpay.java

继续往下看看找关键代码,看注释

以上是生成二维码的接口,如何使用呢??
查看WXPayConfig.java

需要设置appid等配置参数
那怎么设置呢,这里我们自己写个类GFWXPay.java继承即可
将对应的参数传入封装下单接口(注意证书的位置)
public class GFWXPay extends WXPayConfig {
private byte[] certData;
public GFWXPay() throws Exception {
//String certPath = "D:/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
String getAppID() {
return "wxxxxxx";
}
@Override
String getMchID() {
return "xxxxx";
}
@Override
String getKey() {
return "xxxxxxx";
}
@Override
InputStream getCertStream() {
ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
return certBis;
}
@Override
IWXPayDomain getWXPayDomain() {
IWXPayDomain iwxPayDomain = new IWXPayDomain() {
public void report(String domain, long elapsedTimeMillis,
Exception ex) {
}
public DomainInfo getDomain(WXPayConfig config) {
return new IWXPayDomain.DomainInfo(WXPayConstants.DOMAIN_API,
true);
}
};
return iwxPayDomain;
}
/*jf3q获取微信支付二维码*/
public String getWXQr(String body,String out_trade_no,Double total_fee,String notify_url) throws Exception{
GFWXPay config = new GFWXPay();
WXPay wxpay = new WXPay(config);
Map<String, String> data = new HashMap<String, String>();
// 根据微信支付api来设置
data.put("appid", config.getAppID());
data.put("mch_id", config.getMchID()); // 商户号
// 扫码支付
String nonce_str = UUID.randomUUID().toString().replace("-", "").substring(0, 32);
data.put("nonce_str",nonce_str ); // 随机字符串小于32位
String sign = WXPayUtil.generateSignature(data, config.getKey()); // 签名
data.put("sign", sign);
data.put("body", "有偿问答-"+body);
data.put("out_trade_no",out_trade_no); // 交易号
data.put("fee_type", "CNY"); // 默认人民币
data.put("total_fee", ((int)(total_fee * 100))+""); // 订单总金额
//data.put("total_fee","1");//测试
data.put("spbill_create_ip", "xxx.x.x.x"); // 终端ip
data.put("notify_url", notify_url); // 回调地址
data.put("trade_type", "NATIVE"); // 支付场景 APP 微信app支付 JSAPI 公众号支付 NATIVE
/** wxPay.unifiedOrder 这个方法中调用微信统一下单接口 */
Map<String, String> respData = wxpay.unifiedOrder(data);
System.out.println("**************wx qr pay***********************************");
System.out.println(respData);
if (respData.get("return_code").equals("SUCCESS")&&respData.get("return_msg").equals("OK")) {
return respData.get("code_url");//返回二维码的支付参数
}else return "fail";
}
}
新建maven web项目
最好自己新建一个web maven项目,将以上代码复制进去,如下图

写一个支付servlet
package s.jf3q.servlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.github.wxpay.sdk.GFWXPay;
@WebServlet("/CreatQrSrvlet.do")
public class CreatQrSrvlet extends HttpServlet{
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public CreatQrSrvlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
response.setContentType("text/html; charset=utf-8");
response.setHeader( "Content-type", "text/html;charset=UTF-8" );
String body=request.getParameter("body");
String out_trade_no=request.getParameter("out_trade_no");
String total_fee=request.getParameter("total_fee");
try {
//获取支付参数
String qr=new GFWXPay().getWXQr(body, out_trade_no, Double.parseDouble(total_fee) , "http://115.159.216.132");
response.getWriter().write(qr);
response.getWriter().close();
} catch ( Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
doGet(request, response);
}
}
测试
webapp下写个index.tml
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="qrcode.min.js"></script>
<title>Insert title here</title>
</head>
<body>
<form role="form" action="http://localhost:8022/wxpay/CreatQrSrvlet.do" onsubmit="return sub(this);" style="margin-left: 25%;width: 50%;margin-top: 100px;">
<div class="form-group">
<label for="name">订单名称</label>
<input type="text" class="form-control" name="body" required="required">
</div>
<div class="form-group">
<label for="name">订单号</label>
<input type="text" class="form-control" name="out_trade_no" required="required">
</div>
<div class="form-group">
<label for="name">金额</label>
<input type="number" class="form-control" name="total_fee" required="required">
</div>
<button type="submit" class="btn btn-default">提交</button>
</form>
<div id="wx_pay_qr" style="width: 200px;height: 200px;"></div>
<script type="text/javascript">
function sub(v){ //利用ajax发送文字到reg,返回信息
$.ajax({
type:"post",
url:$(v).attr('action'),
dataType:"text",
data:$(v).serialize(),
success:function(data){
new QRCode(document.getElementById("wx_pay_qr"), data );//wx_pay_qr是页面的一个id为wx_pay_qr的div,用来显示二维码的
}
})
return false;
}
</script>
</body>
</html>
效果如下:

后面回调的逻辑和支付宝一样,此处不再赘述
@WebServlet("/wxnotifyservlet.do")
public class WxNotifyServlet extends HttpServlet{
/**
* @see HttpServlet#HttpServlet()
*/
public WxNotifyServlet_goldcoin() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
response.setHeader( "Content-type", "text/html;charset=UTF-8" );
InputStream in = request.getInputStream();
BufferedReader br = new BufferedReader( new InputStreamReader( in, "UTF-8" ) );
StringBuffer result = new StringBuffer();
String line = "";
while ( ( line = br.readLine() ) != null )
{
result.append(line);
}
try {
Map<String, String> map = WXPayUtil.xmlToMap( result.toString() );
System.out.println("===问答=微信扫码支付回调=购买金币=====================================");
String mch_id=map.get("mch_id");
String appid=map.get("appid");
if(map.get("result_code").equals("SUCCESS")&&map.get("return_code").equals("SUCCESS")&&map.get("return_code").equals("SUCCESS")&&mch_id.equals("xxx")&&appid.equals("xxxx")) {
String cts=DateUtils.DateTimeToString(new Date());
//查询订单等
if(o!=null&&o.getIs_pay()!=null&&o.getIs_pay().intValue()==0){
//修改支付状态等其他操作
response.getWriter().write("success");
response.getWriter().close();
}
} else{
//其他操作,,,,
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
好博客就要一起分享哦!分享海报
他的专栏
他感兴趣的技术


新业务
springboot学习
ssm框架课
vue学习
【带小白】java基础速成