微信扫码支付官方文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1
1.在官方文档中下载自己要有的sdk (java的SDK 是一个maven项目,它是不能发布的)
2.在eclipse中引入下载的sdk项目
3.创建一个class,继承sdk的WXPayConfig(这时候可能会报错,因为WXPayConfig的方法访问权限是默认的,只能同包,本类访问)
package ceshi.Model;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import com.github.wxpay.sdk.IWXPayDomain;
import com.github.wxpay.sdk.WXPayConfig;
import com.github.wxpay.sdk.WXPayUtil;
import ceshi.Service.impl.WXPayDomainSimpleImpl;
public class OrderRequest extends WXPayConfig{
private byte[] certData;
private static OrderRequest INSTANCE;
public OrderRequest() throws Exception{
String certPath = "C://Users/Administrator/Desktop/cert/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();
}
private String nonce_str;
public String getNonce_str() {
nonce_str=WXPayUtil.generateNonceStr();
return nonce_str;
}
//
public static OrderRequest getInstance() throws Exception{
if (INSTANCE == null) {
synchronized (OrderRequest.class) {
if (INSTANCE == null) {
INSTANCE = new OrderRequest();
}
}
}
return INSTANCE;
}
public String getAppID() {
return "1111111";
}
public String getAppSecret() {
return "5111111111111111111111111111121c80f8";
}
public String getMchID() {
return "111111111112";
}
public String getKey() {
return "111111111111111111111";
}
//获取商户证书内容
public InputStream getCertStream() {
ByteArrayInputStream certBis;
certBis = new ByteArrayInputStream(this.certData);
return certBis;
}
// HTTP(S) 连接超时时间,单位毫秒
public int getHttpConnectTimeoutMs() {
return 2000;
}
// HTTP(S) 读数据超时时间,单位毫秒
public int getHttpReadTimeoutMs() {
return 10000;
}
public IWXPayDomain getWXPayDomain() {
return WXPayDomainSimpleImpl.instance();
}
public String getPrimaryDomain() {
return "api.mch.weixin.qq.com";
}
public String getAlternateDomain() {
return "api2.mch.weixin.qq.com";
}
@Override
public int getReportWorkerNum() {
return 1;
}
@Override
public int getReportBatchSize() {
return 2;
}
}
4.创建class调用统一下单方法,成功返回的的是Map,需要用到Map中的code_url(二维码链接),再将二维码链接转换成二维码图片
private OrderRequest orderRequest;
private WXPay wxpay;
private long time_stamp = WXPayUtil.getCurrentTimestamp();
private static Logger logger = Logger.getLogger("PayServiceImpl");
/**
* 扫码支付 下单 out_trade_no;商户订单号total_fee;商户订单 金额
* @throws Exception
*/
public Map<String, String> doUnifiedOrder(String out_trade_no, String total_fee) throws Exception {
orderRequest = orderRequest.getInstance();
wxpay = new WXPay(orderRequest, "http://test.letiantian.me/wxpay/notify");
Map<String, String> data = new HashMap<String, String>();
data.put("appid", orderRequest.getAppID());
data.put("mch_id", orderRequest.getMchID());
data.put("time_stamp", String.valueOf(time_stamp));
data.put("nonce_str", orderRequest.getNonce_str());
data.put("body", "代理商管理系统-扫码支付");
data.put("out_trade_no", out_trade_no);// 商户订单号
data.put("device_info", "WEB");
data.put("fee_type", "CNY");
data.put("total_fee", total_fee);
data.put("spbill_create_ip", "127.0.0.1");// 终端IP 微信支付API的机器IP
data.put("notify_url", "http://test.letiantian.me/wxpay/notify");// 通知地址,异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
data.put("trade_type", "NATIVE");// 交易类型
//data.put("product_id", product_id);// 商品ID
// data.put("time_expire", "20170112104120");
Map<String, String> r = null;
try {
r = wxpay.unifiedOrder(data);
System.out.println(r);
System.out.println("url:" + r.get("code_url"));
} catch (Exception e) {
e.printStackTrace();
}
return r;
}
5.微信返回结果接收
@RequestMapping("/notify")
public String notify(String strxml,Model m) throws Exception {
Map<String, String> data = WXPayUtil.xmlToMap(strxml);
String return_code=data.get("return_code");
if(return_code.equals("SUCCESS")) {
m.addAttribute("res", "支付成功");
}else {
m.addAttribute("res", "支付失败");
}
return "zhifu";
}
6.测试 main方法
PayController p=new PayController();
Integer f1=(int) (0.01*100);//支付0.01元
String f2=f1.toString();
try {
System.out.println(p.pagePay( "9874", "123451",f2));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}