当前位置: 首页 > 工具软件 > wxpay-sdk > 使用案例 >

微信支付的sdk实现 (简单易懂)

胥良平
2023-12-01

微信支付已经封装好了支付的借口我们直接去用就可以了

下载地址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

必须要和下单的是一样的。

如果有返回支付成功那就没问题了。

 类似资料: