一,微信支付接入流程图:

二,微信支付类型

  1. 刷卡支付
  2. 公众号支付     //提交资料到 微信公众平台
  3. 扫码支付        //提交资料到 微信公众平台
  4. APP支付        //提交资料到 微信开放者平台
  5. H5支付
  6. 小程序支付

三,扫码支付介绍

    1,扫码支付涉及API

          统一下单

          支付结果通知

          微信支付安全机制

    2,扫码支付开发步骤

          A,下载微信支付demo

                微信扫码支付官网下载--SDK与DE

          B,提取微信支付工具类

          C,编写微信支付调用接口

          D,生成微信支付二维码

          E,编写微信异步通知接口

          F,检测微信支付结果

//创建支付项目

//提供者项目,主要是 商品库存修改 和 订单状态修改 的业务功能,这里省略

····················································································

//消费者项目


//消费者业务层  主要是 商品库存修改 和 订单状态修改 以及 获得订单信息 的业务功能,这里省略

package cn.bdqn.Service;

·················································································

//消费者controller层
package cn.bdqn.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import cn.bdqn.common.Dto;

/**
 *微信扫码支付
 */
@Controller
@RequestMapping(value = "/api/wx")
public class WxPaymentController{
    @Resource
    private QgWxpayService wxpayService;  //业务类
    
    /**
     *调用统一下单API
     *@param orderNo 订单编号
     *@return
     */
    @RequestMapping(value = "/createqccode/{orderNo}",method=RequestMethod.GET)
    @ResponseBody
    public Dto createQccode(@PathVariable String orderNo){
        //通过订单编号获取订单信息
        QgOrder order = wxpayService.loadQgOrderByOrderNo(orderNo);

        Map<String,String> data = new HashMap<String,String>();
        //1,获取请求所需的参数
        data.put("body","腾讯充值中心--QQ会员充值");  //商品描述
        data.put("out_trade_no",orderNo);  //商户订单号
        data.put("device_info","");   //设备号,不是必填
        data.put("fee_type","CNY");   //标价币种
        data.put("total_fee","1");  //订单金额,单位是分,只能是整数不能小数
        data.put("spbill_create_ip","123.12.12.123");  //终端IP,商户提供的自己的IP
        data.put("notify_url","http://穿透地址/api/wx/notify");  //返回通知地址
        data.put("trade_type","NATIVE");  //交易类型,NATIVE:扫码支付
        data.put("product_id","12");  //商品ID,不是必填
        
        //sign值在下载demo里WXPayUtil.java类generateNonceStr()方法获得,拷贝类调用方法
        data.put("nonce_str",WXPayUtil.generateNonceStr());  //随机字符串,保证安全用

        //appid值和mch_id值是在下载的微信支付demo里WXPayConfigImpl.java里 
        data.put("appid","wxab8acb865bb1637e");   //公众账号ID   
        data.put("mch_id","11473623");     //商户号   公众账号ID和商户号通过平台注册账号获得
               
        try{
            //sign值在下载demo里WXPayUtil.java类generateSignedXml()方法获得,拷贝类调用方法
            //key值在下载的微信支付demo里WXPayConfigImpl.java里
            //generateSignedXml()方法第三个参数是签名类型,可以不给,默认MD5
            String reqxml = WXPayUtil.generateSignedXml(data,key值);   //获得签名

            //2,带上参数去请求微信的URL:https://api.mch.weixin.qq.com/pay/unifiedorder
            
            //下载demo里WXPayRequest.java类里requestOnce()方法,拷贝类,删除多于方法
            //修改此方法,见最下面
            WXPayRequest wxPayRequest = new WXPayRequest();
            String wxUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";
            String respxml = wxPayRequest.requestOnce(wxUrl,reqxml);
            Map<String,String> respMap = new HashMap<String,String>();
            //转为MAP
            respMap = WXPayUtil.xmlToMap(respxml);

            //3,拿到请求的返回结果code_url,然后可以生成二维码让用户扫码支付           
            String codeUrl;
            if("SUCCESS".equals(respMap.get("result_code"))){
                codeUrl = respMap.get("code_url");
                return DtoUtil.returnSuccess("获取预支付连接成功",codeUrl);
            }
        }catch(Exception e){
            e.printStackTrace();
        } 
        return DtoUtil.returnFail("获取预支付连接失败","fail");          
    }   

    /**
     *返回通知结果
     *@return
     */
    @RequestMapping(value = "/notity",method = RequestMethod.POST)
    @ResponseBody
    public String paymentCallback(HttpServletResponse response,
        HttpServletRequest request){
        //接收微信支付系统返回的数据
        Map<String,String> reqMap = new HashMap<String,String>();
        Map<String,String> resultMap = new HashMap<String,String>();
        String returnxml = "";
        try{
            InputStream inputStream = request.getInputStream(); 
            BufferedReader in = 
                new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
            StringBuilder sb = new StringBuilder();
            String s;
            while((s = in.readLine()) != null){
                sb.append(s);
            } 
            in.close();
            inputStream.close();
            reqMap = WXPayUtil.xmlToMap(sb.toString); 
            
            //验证数据中签名的正确性
            //key值在下载的微信支付demo里WXPayConfigImpl.java里
            boolean flag = WXPayUtil.isSignatureValid(reqMap,key值,签名类型(可以省略)); 
            
            if(flag){
                //如果签名正确,商户进行自身业务的实现
                String returnCode = reqMap.get("return_code"); 
                if("SUCCESS".equals(returnCode)){  //支付成功
                    //获取微信支付订单号,存入数据库
                    String wxOrderNo = reqMap.get("transaction_id");
                    //获取商户订单号
                    String orderNo = reqMap.get("out_trade_no");
                    //通过商户订单号对订单状态判断,做相应的业务操作
                    //如果订单状态是已支付,不做操作
                    //如果订单是未支付,修改库存,修改订单状态
                    System.out.println("订单状态修改完成");
                }else{  //支付失败                      
                    resultMap.put("return_code","FAIL"); 
                    resultMap.put("return_msg","支付失败");   
                }   
            }else{
                //签名验证失败,则返回相应失败信息
                resultMap.put("return_code","FAIL"); 
                resultMap.put("return_msg","签名失败"); 
            }
            
            returnxml = WXPayUtil.mapToXml(resultMap);
      
        }catch(IOException e){
            e.printStackTrace();
        }catch(Exception e){
            e.printStackTrace();
        }
         
        return returnxml;
    }
}

//请求,只请求一次,不做重试(修改后)
public String requestOnce(String url,String reqxml)throws Exception{
    //不需要证书判断
    BasicHttpClientConnectionManager connManager;
    connManager = new BasicHttpClientConnectionManager(
        RegistryBuilder.<`>create()
            .register("http",PlainConnectionSocketFactory.getSocketFactory())
            .register("https",PlainConnectionSocketFactory.getSocketFactory())
            .build(),
        connFactory:null,
        schemePortResolver:null,
        dnsResolver:null
    );
    
    HttpClient httpClient = HttpClientBuilder.create()
        .setConnectionManager(connManager)
        .build();
    
    HttpPost httpPost = new HttpPost(url);
    
    RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(1000)
        .setConnectTimeout(1000).build();
    httpPost.setConfig(requestConfig);

    StringEmtity postEntity = new StringEntity(reqxml,"UTF-8");
    httpPost.addHeader("Content-type","text/xml");
    httpPost.addHeader(postEntity);

    HttpResponse httpResponse = httpClient.execute(httpPost);
    HttpEntity httpEntity = httpResponse.getEntity();
    return EntityUtils.toString(httpEntity,"UTF-8");
}

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐