冯金伟博客园

  • 首页
  • 业界
  • 前端
  • 运维
  • 建站
  • 软件
  • 生活
  • 后端
  • 创投
  • 运营
  • 影视
  • 游戏
  • 资源
  1. 首页
  2. 软件
  3. 正文

第三方支付之微信支付(扫码支付)

2023年3月19日 57点热度 0人点赞 0条评论

 
第一步:注册微信支付账户,开通扫码支付
具体流程请参照官方说明
 
第二步:创建Maven项目
 
1. 添加微信支付SDK依赖、二维码工具依赖(微信支付需要自己通过二维码工具生成支付二维码)

     <!-- 微信支付 -->
        <dependency>
            <groupId>com.github.wxpay</groupId>
            <artifactId>wxpay-sdk</artifactId>
            <version>0.0.3</version>
        </dependency>
        
        <!-- google二维码工具 -->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.1.0</version>
        </dependency>

2. 实现SDK微信配置类,创建商户自己的配置类

public class WxPayConfig implements WXPayConfig{

    private byte[] certData;
    
    //初始化退款、撤销时的商户证书
    public WxPayConfig() throws Exception {
        String certPath = "D://第三方开放平台/wx_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();
    }

    public String getAppID() {
        return "";
    }

    /** 微信支付商户号 */
    public String getMchID() {
        return "";
    }

    public String getKey() {
        return "";
    }

    public int getHttpConnectTimeoutMs() {
        return 8000;
    }

    public int getHttpReadTimeoutMs() {
        return 10000;
    }

    @Override
    public InputStream getCertStream() {
        ByteArrayInputStream certBis;
        certBis = new ByteArrayInputStream(this.certData);
        return certBis;
    }
}

3. 创建微信支付的控制器类
 
     3.1 初始化微信支付的SDK客户端

private WxPayConfig config;

private WXPay wxpay;

public WxPayController() {
   try {
      //初始化微信支付客户端
      config = new WxPayConfig();
      wxpay = new WXPay(config);
   } catch (Exception e) {
      e.printStackTrace();
   }
}

 3.2 创建预支付接口,生成支付二维码(可以在页面添加img标签,让它的url指向这里就能直接在页面特定区域显示二维码了)

/**
     * 预支付接口,生成支付二维码
     * @param order
     * @return
     * @throws Exception
     */
    @RequestMapping("/wxpay/pay")
    public void pay(HttpServletResponse response) throws Exception {
        //TODO:这里执行商户系统创建新的订单操作
        WxPayOrder order = new WxPayOrder();
        order.setOut_trade_no(System.currentTimeMillis() + "");
        wxPayService.createOrder(order);
        
        //设置请求参数
        Map<String, String> data = new HashMap<String, String>();
        data.put("body", "微信支付测试");
        data.put("out_trade_no", order.getOut_trade_no());
        data.put("device_info", "");
        data.put("fee_type", "CNY");
        data.put("total_fee", "1");
        data.put("spbill_create_ip", "192.168.0.119");
        data.put("notify_url", notify_url);
        data.put("trade_type", "NATIVE");  // 此处指定为扫码支付
        data.put("product_id", "12");

        try {
            //发起支付
            Map<String, String> resp = wxpay.unifiedOrder(data);
            //获取二维码URL
            String code_url = resp.get("code_url");
            //根据url生成二维码
            MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
            // 设置二维码参数
            Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
            BitMatrix bitMatrix = multiFormatWriter.encode(code_url, BarcodeFormat.QR_CODE, 300, 300, hints);
            //返回二维码
            MatrixToImageWriter.writeToStream(bitMatrix, "jpg", response.getOutputStream());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 3.3 创建支付结果回调接口(回调的URL必须公网可以访问,测试时可以使用花生壳等工具映射一个公网地址

/**
     * 支付结果回调
     * @return
     * @throws Exception 
     */
    @PostMapping("/wxpay/notify_url")
    public void notifyUrl(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 读取回调内容
        InputStream inputStream;
        StringBuffer sb = new StringBuffer();
        inputStream = request.getInputStream();
        String s;
        BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
        while ((s = in.readLine()) != null) {
            sb.append(s);
        }
        in.close();
        inputStream.close();
        
        // 支付结果通知的xml格式数据
        String notifyData = sb.toString(); 

        // 转换成map
        Map<String, String> notifyMap = WXPayUtil.xmlToMap(notifyData);

        //支付确认内容
        String resXml = "";
        //验证签名
        if (wxpay.isPayResultNotifySignatureValid(notifyMap)) {        // 签名正确
            WxPayOrder order = wxPayService.getOrder(notifyMap.get("out_trade_no"));
            if(order != null) {
                if("SUCCESS".equals(notifyMap.get("result_code"))) {    //交易成功
                    // TODO:更新订单
                    System.out.println("订单" + notifyMap.get("out_trade_no") + "微信支付成功");
                } else {    //交易失败
                    System.out.println("订单" + notifyMap.get("out_trade_no") + "微信支付失败");
                }
            }
            // 注意特殊情况:订单已经退款,但收到了支付结果成功的通知,不应把商户侧订单状态从退款改成支付成功
            
            //设置成功确认内容
            resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>" + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
        }
        else {  // 签名错误,如果数据里没有sign字段,也认为是签名错误
            //设置失败确认内容
            resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg></return_msg>" + "</xml> ";
            System.out.println("订单" + notifyMap.get("out_trade_no") + "微信支付失败");
        }
        
        //发送通知
        response.getWriter().println(resXml);
    }

 3.4 创建申请退款接口(这里一定要注意先要下载并配置证书,否则会报错;证书下载请参考官方文档,证书配置见商户微信配置类)

/**
     * 微信申请退款接口
     * @param out_trade_no        订单号
     * @throws Exception
     */
    @RequestMapping("/wxpay/refund")
    public void refund(String out_trade_no) throws Exception {
        //设置请求参数
        HashMap<String, String> data = new HashMap<String, String>();
        data.put("out_trade_no", out_trade_no);
        data.put("out_refund_no", out_trade_no);
        data.put("total_fee", "1");
        data.put("refund_fee", "1");
        data.put("refund_fee_type", "CNY");
        data.put("op_user_id", config.getMchID());

        try {
            //调用sdk发起退款
            Map<String, String> result = wxpay.refund(data);
            if("SUCCESS".equals(result.get("result_code"))) {
                //TODO:更新订单
                System.out.println("订单" + out_trade_no + "微信退款成功");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

第三步:测试支付、退款
 
1. 运行项目 mvn jetty:run
 
2. 测试支付接口:http://localhost:8080/wxpay/pay
 
3. 测试退款接口:http://localhost:8080/wxpay/refund
 
 
说明:当前项目仅实现了简单的支付和退款功能,代码大部分搬自官方示例,并不包括完整的支付流程,有什么不明白的地方,欢迎留言
项目源码:https://github.com/13babybear/bounter-pay

标签: 第三方支付之微信支付(扫码支付)
最后更新:2023年3月19日

风君子

独自遨游何稽首 揭天掀地慰生平

点赞
< 上一篇
下一篇 >

猜你喜欢

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

风君子

独自遨游何稽首 揭天掀地慰生平

最新 热点 随机
最新 热点 随机
NASA 退役宇航员谈 UFO:可能只是眼睛在捉弄我们 AVX512惹麻烦 英特尔大小核给AMD上了一课 Zen5锐龙吸取教训 WWDC23 明天凌晨开幕,苹果向开发者送出限量版手提袋、徽章等 顺利交付!神十五航天员带回了20多公斤实验样品:竟有一种虫子 消息称推特新任CEO将于本周一上任 有望重振广告业务 苏姿丰拯救了AMD,如今她想在AI上与黄仁勋竞争霸主 华为手机有救了(华为没救了) Hostease主机最新购买教程 苹果手机如何给电脑共享网络(苹果电脑怎么给手机共享网络) 梦见老公坐车怎么回事 是不是要走大运了
小米手机:屏幕黑屏怎么办?2018最新版WPS表格,如何设置表格的行距和列宽中国矿业大学是985还是211朋友圈保存别人的图片对方知道吗实景搜证+策略推理《风暴岛》新玩法免费畅玩!迅捷 FW315R 无线路由器当做交换机使用比华为P60 Pro更强!小米13 Ultra最强信号如何打造?官方详解npm包–rimraf[通俗易懂](intrwins的)exe文件为什么危险(如何编辑exe文件)腾达 N304 无线路由器修改密码及网络名称操作流程
消息称小米 13 Ultra 最高配 1TB 存储,旗下首款 1TB 5G 旗舰 Q弹好滋味!鲨鱼菲特鸡胸肉丸60g*10袋 19.9元包邮 寻路中国好游戏:为什么中国做不出3A大作? 余额宝收益怎么提现 迪士尼确认《黑寡妇》国外上映时间:国内影迷仍要等 PS5下月亮相? “中国天眼”再提速 让FAST更FAST的秘诀何在? 主持人直播时突然流鼻血 淡定播报引网友点赞 未按规定接种疫苗进入办公区:美国有线电视新闻网开除3名员工 oppo r11怎么样?oppor11全面深度评测图解
huilitao标签聚合
酒 胡萝卜 食物 私房菜 有什么好处 水果 能吃 鸡蛋 身体 会胖吗 副作用 吃什么 相克 好处 饮食 作用 土豆食谱 方法 牛肉 豆腐 糖 热量 茄子 好吃 营养 皮肤过敏 区别 菜谱 牛肉食谱 功效 怎么做 营养价值 豆腐食谱 维生素 土豆 热菜 食用方法 常吃 健康 排骨 汤类 高血压 牛奶 糖尿病人 做法 吃法 下饭菜 海鲜 一起吃 排骨食谱
标签聚合
快科技 微软 投资者 芯片 股票 业界 电动车 美国 智能手机 荣耀 贷款 理财知识 科技 小米 额度 京东 华为 信用卡 苹果 显卡 利息 余额 处理器 马斯克 身份证 支付宝 中国 游戏 来了 利率 AMD IT资讯 秘籍 手机 银行 借款人 iphone 腾讯 投资理财 网友 银行卡 信用 三星 比亚迪 汽车 程序 股价 旗舰 花呗 特斯拉
标签聚合
上市 中国 不需要 房贷 医疗保险 社保 阳光人寿 市场 保障 银行 信贷 A股 涨停 易安财险 医疗险 企业贷款 支付宝 股票 机构 两全保险 保险产品 重疾险 基金 寿险 投资理财 股票基础 个人贷款 平安人寿 保险 理财知识 贷款申请 ChatGPT 手续费 违约金 太平洋人寿 意外险 贷款还款 基金理财 额度 信用卡 征信 余额宝 有多少 公司 优惠政策 互联网理财 最新 数据 美国 贷款

COPYRIGHT © 2023 冯金伟博客园. ALL RIGHTS RESERVED.

粤ICP备2022149896号