微信原生支付方式二(实现二)

1.maven引用

<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-pay</artifactId>
    <version>3.7.0</version>
</dependency>

2.配置文件

# 微信支付相关配置
wx:
  pay:
    appId: #微信公众号或者小程序等的appid
    mchId: #微信支付商户号
    mchKey:  #微信支付商户密钥
    subAppId:  #服务商模式下的子商户公众账号ID
    subMchId:  #服务商模式下的子商户号
    keyPath:  # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
    notifyUrl: #外网可访问的回调地址

3.微信支付引用第三方jar配置文件

package com.weChat.properties;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @Author FangYN
 * @Date 2020/7/1
 * @Description 微信支付
 **/
@Slf4j
@Data
@Component
@ConfigurationProperties(prefix = "wx.pay")
public class WxPayProperties {

    /**
     * 设置微信公众号或者小程序等的appid
     */
    private String appId;

    /**
     * 微信支付商户号
     */
    private String mchId;

    /**
     * 微信支付商户密钥
     */
    private String mchKey;

    /**
     * 服务商模式下的子商户公众账号ID,普通模式请不要配置,请在配置文件中将对应项删除
     */
    private String subAppId;

    /**
     * 服务商模式下的子商户号,普通模式请不要配置,最好是请在配置文件中将对应项删除
     */
    private String subMchId;

    /**
     * apiclient_cert.p12文件的绝对路径,或者如果放在项目中,请以classpath:开头指定
     */
    private String keyPath;

    /**
     * 支付回调地址
     */
    private String notifyUrl;

}
package com.weChat.config;

import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import com.weChat.properties.WxPayProperties;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author FangYN
 * @Date 2020/7/1
 * @Description 微信支付配置
 **/
@Configuration
public class WxPayConfiguration {
    @Autowired
    private WxPayProperties properties;

    @Bean
    @ConditionalOnMissingBean
    public WxPayService wxService() {
        WxPayConfig payConfig = new WxPayConfig();
        payConfig.setAppId(StringUtils.trimToNull(this.properties.getAppId()));
        payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId()));
        payConfig.setMchKey(StringUtils.trimToNull(this.properties.getMchKey()));
        payConfig.setSubAppId(StringUtils.trimToNull(this.properties.getSubAppId()));
        payConfig.setSubMchId(StringUtils.trimToNull(this.properties.getSubMchId()));
        payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath()));
        payConfig.setNotifyUrl(StringUtils.trimToNull(this.properties.getNotifyUrl()));
        // 可以指定是否使用沙箱环境
        payConfig.setUseSandboxEnv(false);

        WxPayService wxPayService = new WxPayServiceImpl();
        wxPayService.setConfig(payConfig);
        return wxPayService;
    }
}

4.正式接口逻辑示例

4.1 创建预订单,生成收款二维码

public WeChatPayVo createOrder(HttpServletRequest request) throws Exception {
        String productId = "1";
        String tradeNo = UUIDUtils.getUUID();// 订单编号
        String description = "**产品";// 订单描述
        String totalAmount = "0.01";
        WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
        orderRequest.setSignType(WxPayConstants.SignType.MD5);
        orderRequest.setDeviceInfo("WEB");
        orderRequest.setTradeType("NATIVE");
        orderRequest.setBody(description);// 商品名称
        orderRequest.setOutTradeNo(tradeNo);// 当前系统生成的订单编号
        orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(totalAmount));// 标价金额
        orderRequest.setSpbillCreateIp(IPUtils.getIpAddr(request));// 终端IP
//            orderRequest.setOpenid(null);// 用户标识 trade_type=JSAPI时(即JSAPI支付),此参数必传,此参数为微信用户在商户对应appid下的唯一标识
        orderRequest.setProductId(productId); // trade_type=NATIVE时,此参数必传。此参数为二维码中包含的商品ID
        WxPayUnifiedOrderResult orderResult = wxService.unifiedOrder(orderRequest);
        if ("FAIL".equals(orderResult.getReturnCode()) || "FAIL".equals(orderResult.getResultCode()))
            throw new Exception("订单创建失败,请重新请求");
        // 保存订单信息**

        // 返回信息对象
        WeChatPayVo prePay = new WeChatPayVo();
        prePay.setPrice(new BigDecimal(totalAmount));
        prePay.setDescription(description);
        prePay.setTradeNo(tradeNo);
        prePay.setPrepayId(orderResult.getPrepayId());
        prePay.setCodeUrl(orderResult.getCodeURL());
        return prePay;
    }

4.2 支付后的回调逻辑

public String callBack(HttpServletRequest request) throws IOException, WxPayException {
        String xmlResult = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding());
        WxPayOrderNotifyResult notifyResult = wxService.parseOrderNotifyResult(xmlResult);
        if ("FAIL".equals(notifyResult.getReturnCode())) return WxPayNotifyResponse.fail("return_code不正确");
        String tradeNo = notifyResult.getOutTradeNo();// 系统订单号
        if ("FAIL".equals(notifyResult.getResultCode())) {// 支付失败 
            return WxPayNotifyResponse.fail("result_code不正确");
        }
        log.info("微信notify:微信支付回调:修改的订单===>" + tradeNo);
        // 根据tradeNo查询系统的订单信息,根据业务处理相关逻辑 

        // 更新订单交易成功相关数据 

        return WxPayNotifyResponse.success("OK");
    }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值