微信支付已经封装好了支付的借口我们直接去用就可以了
下载地址https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
这里我是用Java实现的。
第一步引入依赖
<!--wxPay-->
<dependency>
<groupId>com.github.wxpay</groupId>
<artifactId>wxpay-sdk</artifactId>
<version>0.0.3</version>
</dependency>
在你的Controller类的import 添加
import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;
应该这两个就够用了
接下来就要先实现一下WXPayConfig
自己修改getAppId等内容。在构造方法中,我全部都注释掉了。这里面是加载证书。如果你不需要就可以先注释掉,像下单,查询订单等,是不需要用到证书的。
package com.xz.app.config;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import com.github.wxpay.sdk.WXPayConfig;
public class MyWXConfig implements WXPayConfig {
private byte[] certData;
public MyWXConfig() throws Exception {
/* String certPath = "";
File file = new File(certPath);
InputStream certStream = new FileInputStream(file);
this.certData = new byte[(int) file.length()];
certStream.read(this.certData);
certStream.close();*/
}
public String getAppID() {
return "xxx";
}
public String getMchID() {
return "xxx";
}
public String getKey() {
return "xxx";
}
public InputStream getCertStream() {
ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
return certBis;
}
public int getHttpConnectTimeoutMs() {
return 8000;
}
public int getHttpReadTimeoutMs() {
return 10000;
}
}
正事开始写controller类
public Map<String, Object> WXPayOrder(HttpServletRequest httpRequest, HttpServletResponse httpResponse,
@RequestHeader("token") @ApiParam(value = "权限校验") String token, @RequestParam("orderID") @ApiParam(value = "订单ID") String orderID,HttpServletRequest request) throws Exception {
MyWXConfig config = new MyWXConfig();
WXPay wxpay = new WXPay(config);
Map<String, String> data = new HashMap<String, String>();
data.put("body", "i");
String out_trade_no = String.valueOf(UUID.next());
System.out.println("out_trade_no"+out_trade_no);
data.put("out_trade_no", out_trade_no);//商户订单号
data.put("total_fee", "1");
data.put("spbill_create_ip", request.getRemoteAddr());
data.put("notify_url", ConstantUtil.NOTIFY_URL);
data.put("trade_type", "NATIVE"); // 此处指定为扫码支付
try {
Map<String, String> resp = wxpay.unifiedOrder(data);
System.out.println(resp);
return MapHelper.success("code_url", resp.get("code_url"));
} catch (Exception e) {
e.printStackTrace();
}
return MapHelper.error();
}
这个类型是微信扫码支付的,要改可以在
data.put("trade_type", "NATIVE"); // 此处指定为扫码支付
中改为其他支付。
附上
String.valueOf(UUID.next());中的方法
public class UUID {
private static Date date = new Date();
private static StringBuilder buf = new StringBuilder();
private static int seq = 0;
private static final int ROTATION = 99999;
public static synchronized long next() {
if (seq > ROTATION)
seq = 0;
buf.delete(0, buf.length());
date.setTime(System.currentTimeMillis());
String str = String.format("%1$tY%1$tm%1$td%1$tk%1$tM%1$tS%2$05d", date, seq++);
return Long.parseLong(str);
}
private UUID(){
}
}
注意sign是不用自己生产的,它会自动帮你弄好
如果返回签名错误的话,不是sign的问题,是你自己的问题,看看必须要填的有没有填写。填写的有没有按照要求来
成功后会返回给你字符串,其中有code_url=weixin://wxpay/bizpayurl?pr=......
把这个放到网址生成二维码的网址,用手机一扫就成功了。
如果想要查询是否用户已经支付成功的话,那要设置好回调借口,且这个借口必须是外网能够访问的。因为是微信那边要访问。那就只能把项目放到服务器了。
但如果不想那么弄也有另外一种方法,就是进行订单的查询。
/**
* 订单查询
* @return
* @throws Exception
*/
@RequestMapping("trackOrder")
@ResponseBody
public Map<String, Object> trackOrder(@RequestParam("out_trade_no") String out_trade_no)
throws Exception {
MyConfig config = new MyConfig();
WXPay wxpay = new WXPay(config);
Map<String, String> data = new HashMap<String, String>();
data.put("out_trade_no", out_trade_no);
try {
Map<String, String> resp = wxpay.orderQuery(data);
System.out.println(resp);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
记住
out_trade_no
必须要和下单的是一样的。
如果有返回支付成功那就没问题了。