微信支付实现

第一步、准备必须数据,这些数据需要从注册的微信授权的支付信息,加载进Spring容器中

pom坐标

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

weixinpay.properties

appid=wx**********
partner=**********
partnerkey=*******
notifyurl=http://******.ngrok.io/WeChatPay/WeChatPayNotify

第二步、调用接口实现访问微信接口获得相关信息

import com.alibaba.dubbo.config.annotation.Service;
import com.github.wxpay.sdk.WXPayUtil;
import com.pinyougou.mapper.TbOrderMapper;
import com.pinyougou.mapper.TbPayLogMapper;
import com.pinyougou.pay.service.PayService;
import com.pinyougou.pojo.TbOrder;
import com.pinyougou.pojo.TbPayLog;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import utils.HttpClientUtil;

import javax.jws.Oneway;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Service
public class PayServiceImpl implements PayService {

    @Autowired
    private RedisTemplate redisTemplate;

    @Value("${appid}")
    private String appid;       //商家id

    @Value("${partner}")
    private String partner;     //商户号

    @Value("${partnerkey}")
    private String partnerkey;  //商户密钥

    @Value("${notifyurl}")
    private String notifyurl;  //回调地址,不是必要参数,但是必须传

    @Autowired
    private TbPayLogMapper payLogMapper;

    @Autowired
    private TbOrderMapper orderMapper;

    @Override
    public Map createNative(String out_trade_no, String total_fee) {
        //准备请求微信的api

        try {
            //参数设置微信支付连接地址
            HttpClientUtil clientUtil = new HttpClientUtil("https://api.mch.weixin.qq.com/pay/unifiedorder");

            //设置请求的参数
            Map map = new HashMap();
            map.put("appid", appid);
            map.put("mch_id", partner);
            map.put("nonce_str", WXPayUtil.generateUUID());  //32位要求的字符串
            map.put("body", "随便写");
            map.put("out_trade_no", out_trade_no);  //内部订单id
            map.put("total_fee", total_fee);//总价格
            map.put("spbill_create_ip", "127.0.0.1");//写个ip就行
            map.put("notify_url", notifyurl);
            map.put("trade_type", "NATIVE");  //NATIVE是二维码原生方式

            String signedXml = WXPayUtil.generateSignedXml(map, partnerkey);//微信提供的方法

            System.out.println("=请求内容=:"+signedXml);

            clientUtil.setHttps(true); //微信接口是https协议
            clientUtil.setXmlParam(signedXml);   //需要将参数设置为xml格式的string字符串

            clientUtil.post();  //发送post请求

            //获取返回值xml类型的string字符串
            String content = clientUtil.getContent();

            System.out.println("=返回内容="+content);
            //通过微信工具类将xml转成map
            Map responseMap = WXPayUtil.xmlToMap(content);//微信提供的方法

            Map returnMap = new HashMap<>(); //封装map是为了指定返回的参数内容
            returnMap.put("out_trade_no", out_trade_no);
            returnMap.put("total_fee",total_fee );
            returnMap.put("code_url", responseMap.get("code_url"));  //微信支付地址
            return returnMap;

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
//查询支付状态
    @Override
    public Map queryPayStatus(String out_trade_no) {

        try {
            //准备map请求对象
            Map map = new HashMap();
            map.put("appid", appid);
            map.put("mch_id", partner);
            map.put("out_trade_no", out_trade_no);
            map.put("nonce_str", WXPayUtil.generateUUID());


            //再通过微信工具类将map转xml,并带上签名
            String signedXml = WXPayUtil.generateSignedXml(map, partnerkey);
            System.out.println("=请求内容=:"+signedXml);
            //准备发送请求
            HttpClientUtil clientUtil = new HttpClientUtil("https://api.mch.weixin.qq.com/pay/orderquery");
            //设置请求方式是https
            clientUtil.setHttps(true);
            //设置请求参数
            clientUtil.setXmlParam(signedXml);
            //发送请求
            clientUtil.post();
            //获取返回结果并且将xml转map对象
            String content = clientUtil.getContent();//xml的string字符串
            System.out.println("=返回内容="+content);

            Map<String, String> returnMap = WXPayUtil.xmlToMap(content);
            return returnMap;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

}

第三步、测试

会使用一个自定义工具类HttpClientUtil

猜你喜欢

转载自www.cnblogs.com/kitor/p/11296139.html