第一次接触 java开发微信扫码支付,获取二维码链接

来源:互联网 发布:定制衣柜 知乎 编辑:程序博客网 时间:2024/06/05 20:33

微信扫码支付官方文档: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();
}