微信扫码支付-----适合初学者

微信支付整了两天,看了很多文档,没整太明白!其实一个技术的懂与不懂,无非就在于一个关键点你有没有搞明白,明白了就豁然开朗!也曾尝试着去看过源码,但是一头雾水,建议先把源码放进idea里打开,浏览README.md文件,很详细,但代码微信一直未更新!
微信老代码WXPayConfig还是接口实现,现在已经是抽象类了

微信扫码支付开发文档

如果是第一次做这块的业务,个人建议还是得将微信提供的开发文档结合README.md文件看一遍,最起码你的把参数整明白,README.md文件内有代码示例,弄明白统一下单,其他也就那样了。

微信支付是通过xml的形式交互的,所以记得将map转换成xml,官方提供有工具类

扫码支付简单来说就是后台调用微信的统一下单的方法,该方法会返回你一串codeurl,此codeurl返给前端,生成二维码由此支付!支付成功后,微信会通过回调地址访问访问你的接口发送支付成功或失败,前端开始轮循请求支付结果,也可以主动调用查询订单的方法,以确保订单支付成功!

以下代码均是测试阶段有很多不足待优化=====直接用也可以,但是得根据个人项目代码进行优化!如有问题请留言,共同学习!

在这里插入图片描述

pom.xml 引入maven依赖

<!-- https://mvnrepository.com/artifact/com.github.wxpay/wxpay-sdk -->
    <dependency>
        <groupId>com.github.wxpay</groupId>
        <artifactId>wxpay-sdk</artifactId>
        <version>0.0.3</version>
    </dependency>

首先实现WXPayConfig
关键点 就三个 appid(小程序id)、mchid(商户号)、key(秘钥)
这三个是在申请微信支付时微信返给你的信息,还有一个证书,扫码支付不需要证书

	package rongheng.member.config;
	
	import org.springframework.context.annotation.Configuration;
	
	import java.io.*;
	@Configuration
	public class WXPConfig implements com.github.wxpay.sdk.WXPayConfig {
	
	    private byte[] certData;
	
	    public WXPConfig() throws Exception {
	        /** 加载证书  这里证书需要到微信商户平台进行下载,在服务器的证书路径*/
	        /*String certPath = "cert/wxpay/apiclient_cert.p12";
	        File file = new File(certPath);
	        InputStream certStream = new FileInputStream(file);
	        this.certData = new  byte[(int) file.length()];
	        certStream.read(this.certData);
	        certStream.close();*/
	    }
	    /*小程序id*/
	    @Override
	    public String getAppID() {
	        return "=======";
	    }
	    /*商户号*/
	    @Override
	    public String getMchID() {
	        return "=====";
	    }
	    /*秘钥*/
	    @Override
	    public String getKey() {
	        return "======";
	    }
	
	    @Override
	    public InputStream getCertStream() {
	        ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
	        return certBis;
	    }
	
	    @Override
	    public int getHttpConnectTimeoutMs() {
	        return 8000;
	    }
	
	    @Override
	    public int getHttpReadTimeoutMs() {
	        return 10000;
	    }
	}

实现统一下单,支付回调,查询订单

	package rongheng.member.controller;
	
	import com.github.wxpay.sdk.WXPay;
	import com.github.wxpay.sdk.WXPayConstants;
	import com.github.wxpay.sdk.WXPayUtil;
	import io.swagger.annotations.Api;
	import io.swagger.annotations.ApiOperation;
	import org.springframework.web.bind.annotation.*;
	import rongheng.member.config.WXPConfig;
	import rongheng.member.entity.Orders;
	import rongheng.member.service.pc.OrderService;
	
	import javax.annotation.Resource;
	import javax.servlet.http.HttpServletRequest;
	import javax.servlet.http.HttpServletResponse;
	import java.io.BufferedReader;
	import java.io.InputStream;
	import java.io.InputStreamReader;
	import java.io.PrintWriter;
	import java.util.HashMap;
	import java.util.Map;
	
	@CrossOrigin(origins = "*")
	@RestController
	@Api(value = "微信扫码支付")
	@RequestMapping(value = "/api/wxpay",method = RequestMethod.GET)
	public class WXPayController {
	
	    @Resource
	    private WXPConfig wxpConfig;
	    @Resource
	    private OrderService orderService;
	
	    @ApiOperation("统一下单")
	    @RequestMapping(value = "/createqccode/{onlineNumber}",produces = "application/json")
	    public Map<String,String> createqccode(@PathVariable String onlineNumber) throws Exception{
	        Map<String,String> data = new HashMap<>();
	        /*根据订单号查询订单*/
	        Orders orders = orderService.queryOrdersById(onlineNumber);
	        if (orders == null){
	            data.put("401","请确认订单号");
	            return data;
	        }
	        WXPay wxPay = new WXPay(wxpConfig);
	
	        /*商品描述*/
	        data.put("body", "订单支付");
	        /*商户订单号*/
	        data.put("out_trade_no", onlineNumber);
	        /*设备号--暂时不用*/
	        //data.put("device_info", "");
	        /*货币类型--人民币*/
	        data.put("fee_type", "CNY");
	        /*订单总金额,单位为分*/
	        data.put("total_fee", "1");
	        /*调用微信支付API的机器IP*/
	        data.put("spbill_create_ip", "123.12.12.123");
	        /*异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数*/
	        //测试阶段可以利用花生壳这个工具,做一个内网穿透,映射你本地ip
	        data.put("notify_url", "http://www.example.com/wxpay/notify");
	        // 此处指定为扫码支付  JSAPI 公众号支付  NATIVE 扫码支付
	        data.put("trade_type", "NATIVE");
	        /*trade_type=NATIVE时,此参数必传。此参数为二维码中包含的商品ID,商户自行定义*/
	        data.put("product_id", orders.getOrderid());
	        /*小程序支付需要传openid*/
	        //data.put("openid","oAN2l5MrWaT0vjaOv6u_ZYKxbYRE");
			//调用统一下单方法
	            Map<String, String> resp = wxPay.unifiedOrder(data);
	            System.out.println("======================"+resp.get("code_url"));
	            //以下参数可以想看微信支付文档成功或失败后返回的具体参数含义
	            if (resp.get("return_code").equals(WXPayConstants.SUCCESS)){
	                if (resp.get("result_code").equals(WXPayConstants.SUCCESS)){
	                    Map<String,String> result = new HashMap<>();
	                    result.put("onlineNumber",orders.getOnlineNumber());
	                    result.put("orderAmount",orders.getOrderAmount());
	                    result.put("codeUrl",resp.get("code_url"));
	                    return result;
	                }else {
	                    Map<String,String> map = new HashMap<>();
	                    map.put(resp.get("err_code_des"),"1000001");
	                    return map;
	                }
	            } else {
	                Map<String,String> map = new HashMap<>();
	                map.put(resp.get("return_msg"),"1000002");
	                return map;
	            }
	    }
	    /*支付回调*/
	    @ApiOperation("支付回调")
	    @RequestMapping(value = "notify" )
	    public void paymentCallback(HttpServletRequest request, HttpServletResponse response) throws Exception{
	        try {
	            /*先从请求读取数据*/
	            InputStream inputStream = request.getInputStream();
	            BufferedReader in = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
	            StringBuilder builder = new StringBuilder();
	            String s = null;
	            while ((s = in.readLine()) != null){
	                builder.append(s);
	            }
	            in.close();
	            inputStream.close();
	            /*把xml格式的响应结果转换成map*/
	            Map<String,String> payResult = WXPayUtil.xmlToMap(builder.toString());
	            System.out.println("====================="+payResult);
	
	            WXPay wxPay = new WXPay(wxpConfig);
	            /*返回结果验证签名*/
	            boolean flag = wxPay.isResponseSignatureValid(payResult);
	            System.out.println("=========flag============"+flag);
	
	            if (flag){
	                String returnCode = payResult.get("return_code");
	                System.out.println("=========return_code============"+returnCode);
	                if (WXPayConstants.SUCCESS.equals(returnCode)){
	                    String resultCode = payResult.get("result_code");
	                    System.out.println("=========resultCode============"+resultCode);
	                    if (WXPayConstants.SUCCESS.equals(resultCode)){
	                        String onlineNumber = payResult.get("out_trade_no");
	                        Orders orders = orderService.queryOrdersById(onlineNumber);
	                        if (orders != null){
	                            if (Integer.parseInt(payResult.get("total_fee")) == Integer.parseInt(orders.getOrderAmount() )){
	                                /*微信支付单号*/
	                                String transactionId = payResult.get("transaction_id");
	                                System.out.println("==========transactionId============"+transactionId);
	                                Map<String,String> reply = new HashMap<>();
	                                reply.put("return_code","SUCCESS");
	                                reply.put("return_msg","OK");
	                                response.setContentType("application/xml;charset=utf-8");
	                                PrintWriter printWriter = response.getWriter();
	                                printWriter.print(WXPayUtil.mapToXml(reply));
	                                printWriter.flush();
	                                printWriter.close();
	                            }
	                        }
	                    }
	                }
	            }
	        }catch (Exception e){
	            e.printStackTrace();
	        }
	    }
	    /*订单查询*/
	    @ApiOperation("订单查询")
	    @RequestMapping("orderQuery")
	    public Map<String,String> orderQuery(String onlineNumber){
	        WXPay wxPay = new WXPay(wxpConfig);
	        Map<String,String> data = new HashMap<>();
	        data.put("out_trade_no",onlineNumber);
	        try {
	            Map<String,String> resp = wxPay.orderQuery(data);
	            /*在return_code 、result_code、trade_state都为SUCCESS时有返回*/
	            if (resp.get("return_code").equals("SUCCESS")){
	                if (resp.get("result_code").equals("SUCCESS")){
	                    if (resp.get("trade_state").equals("SUCCESS")){
	                        /*商户订单号*/
	                        data.put("out_trade_no",resp.get("out_trade_no"));
	                        /*支付时间*/
	                        data.put("time_end",resp.get("time_end"));
	                        /*微信支付订单号*/
	                        data.put("transaction_id",resp.get("transaction_id"));
	                        /*支付金额*/
	                        data.put("total_fee",resp.get("total_fee"));
	                        return data;
	                    }else {
	                        data.put(resp.get("return_msg"),"2000001");
	                        return data;
	                    }
	
	                }else {
	                    data.put(resp.get("return_msg"),"2000002");
	                    return data;
	                }
	            }else {
	                data.put(resp.get("return_msg"),"2000003");
	                return data;
	            }
	        }catch (Exception e){
	            e.printStackTrace();
	        }
	        return null;
	    }
	}
  • 15
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值