java使用微信支付API完成支付功能目录


文章目录

  • java使用微信支付API完成支付功能目录
  • 微信支付官方介绍
  • Native支付介绍
  • 1.Api文档查看
  • 2.下单功能实现
  • 1.接口链接
  • 2.请求参数和返回参数
  • Native的下单和查询支付
  • 引入依赖
  • 涉及的工具类
  • 下单功能
  • 1.创建一个实体类封装数据
  • 2.创建controller方法
  • 3.对应的service
  • 查看订单状态


微信支付官方介绍

https://pay.weixin.qq.com/wiki/doc/api/index.html

java 订单支付 并发问题 java支付功能实现_java 订单支付 并发问题

提示:在这边选择想要使用的支付方式点击查看api文档,我这边开发的是web项目,所以就以Native支付来讲解。


提示:以下是本篇文章正文内容,下面案例可供参考

Native支付介绍

1.Api文档查看

点击进入Native支付—Api列表

java 订单支付 并发问题 java支付功能实现_java_02

在这里可以选择想要的接口进行使用,并且查看需要带的参数,发送请求路径等

2.下单功能实现

1.接口链接

接口链接就是我们往此链接发送请求,即可得到我们想要的数据,比如二维码,订单状态等

URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder
URL地址:https://api2.mch.weixin.qq.com/pay/unifiedorder(备用域名)见跨城冗灾方案
这两个接口都可以使用,推荐使用第一个

2.请求参数和返回参数

java 订单支付 并发问题 java支付功能实现_微信支付_03

我们只要关注必填参数即可,感兴趣可以自己去官网看一下,这边不一一介绍了

Native的下单和查询支付

引入依赖

<dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.3</version>
        </dependency>

 <dependency>
            <groupId>com.github.wxpay</groupId>
            <artifactId>wxpay-sdk</artifactId>
            <version>0.0.3</version>
        </dependency>

涉及的工具类

HttpClient:模仿网页发送http请求,wx提供的工具包
CommonResult:返回参数

@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("响应的结果")
public class CommonResult {
    @ApiModelProperty("响应的状态码")
    private Integer code;
    @ApiModelProperty("响应的信息")
    private String msg;
    @ApiModelProperty("响应的数据")
    private Object result;
}

我们在使用之前要明确一些参数

  • APPID :服务号的应用号
  • MCH_ID:商户号
  • APP_SECRECT:服务号的应用密码
  • API_KEY:API密钥

这些在开发时会有人提供

下单功能

1.创建一个实体类封装数据

public class ConfigUtil {
    public final static String APPID = "wx8087d8149331d27c";//服务号的应用号
    public final static String MCH_ID = "1532192611";//商户号
    public final static String APP_SECRECT = "e8cb3f526ac67e41dffb8fb4201873da";//服务号的应用密码
    public final static String API_KEY = "Cc158380629071583806290715838062";//API密钥
}

2.创建controller方法

@GetMapping("erweima")
public Result createNative(String orderno){
    Map testorder = payService.createNative(orderno);
    Result result=new Result();
    result.setCode(100);
    result.setMsg("");
    result.setT(testorder);
    return  result;
}

3.对应的service

创建二维码的时候需要知道将钱付给谁,也就是商户的信息,由于什么原因发起的支付,所以这个service里面需要传递的有商户的信息还有订单的信息

各个参数的意思请参考微信支付开发文档

public Map createNative(String orderNo) {
    try {
        Map m = new HashMap();
        //1、设置支付参数
        m.put("appid", ConfigUtil.APPID);//"wx74862e0dfcf69954"
        m.put("mch_id",ConfigUtil.MCH_ID );//"1558950191"
        m.put("nonce_str", WXPayUtil.generateNonceStr());
        m.put("body", "课程的信息");
        m.put("out_trade_no", orderNo);
        m.put("total_fee", new BigDecimal("0.01").multiply(new BigDecimal("100")).longValue() + "");
        m.put("spbill_create_ip", "127.0.0.1");
        //设置的回调的路径
        m.put("notify_url","http://www.chenkaixiang.top/notifyWeiXinPay\n");// 
        //支付类型   native 扫码支付
        m.put("trade_type", "NATIVE");
        //2、HTTPClient来根据URL访问第三方接口并且传递参数
        //https://api.mch.weixin.qq.com/v3/pay/transactions/native
        HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
        //client设置参数
        client.setXmlParam(WXPayUtil.generateSignedXml(m, ConfigUtil.API_KEY));//"Cc158380629071583806290715838062"));//"T6m9iK73b0kn9g5v426MKfHQH7X8rKwb"
        client.setHttps(true);
        client.post();
        //3、返回第三方的数据
        String xml = client.getContent();
        Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);
        //4、封装返回结果集
        Map map = new HashMap<>();
        map.put("out_trade_no", orderNo);
        map.put("course_id", 1);
        map.put("total_fee", 0.01);
        map.put("result_code", resultMap.get("result_code"));
        map.put("code_url", resultMap.get("code_url"));
        //微信支付二维码2小时过期,可采取2小时未支付取消订单
        //redisTemplate.opsForValue().set(orderNo, map, 120, TimeUnit.MINUTES);
        return map;
    } catch (Exception e) {
        e.printStackTrace();
        return new HashMap<>();
    }
}

查看订单状态

支付完成之后需要查询一下订单的状态,到底是否支付成功,成功支付要进行操作
controller:

@GetMapping("getPayStatus/{orderNo}")
public Result getPayStatus(@PathVariable("orderNo")String orderNo) throws AAAException {
    Map<String,String> map=payService.getPayStatus(orderNo);
    System.out.println(map);
    Result result=new Result();
    if(map==null){
        result.setMsg("支付失败");
        return result;
    } else if(map.get("trade_state").equals("SUCCESS")){
        //修改订单状态 并添加支付记录
        result.setMsg("支付");
        result.setT(map);
        return result;
    }else{
        result.setCode(2500);
        result.setMsg("支付中");
        result.setT(map);
        return result;
    }

对应的service

public Map<String, String> getPayStatus(String orderNo) throws AAAException {
    try {
        String url = "https://api.mch.weixin.qq.com/pay/orderquery";
        Map<String, String> map = new HashMap<>();
        map.put("appid",ConfigUtil.APPID);
        map.put("mch_id", ConfigUtil.MCH_ID);
        map.put("out_trade_no", orderNo);
        map.put("nonce_str", WXPayUtil.generateNonceStr());
        HttpClient httpClient = new HttpClient(url);
        httpClient.setXmlParam(WXPayUtil.generateSignedXml(map,ConfigUtil.API_KEY ));//"Cc158380629071583806290715838062"));//"T6m9iK73b0kn9g5v426MKfHQH7X8rKwb"));
        httpClient.setHttps(true);
        httpClient.post();
        String xml = httpClient.getContent();
        Map<String,String> resultMap=WXPayUtil.xmlToMap(xml);
        System.out.println(resultMap);
        return resultMap;
    }catch (Exception e){
        e.printStackTrace();
        throw  new AAAException(20001,"支付失败");
    }
}