微信支付之扫码支付实例

本例是采用微信扫码支付模式二

 

增加maven依赖

<dependency>
    <groupId>com.github.wxpay</groupId>
    <artifactId>wxpay-sdk</artifactId>
    <version>0.0.3</version>
</dependency>
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.2.0</version>
</dependency>
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.2.0</version>
</dependency>

付款二维码

<img src="${pageContext.request.contextPath}/WxPay/getQRCode?orderId=1" />

WxPayController

package com.zns.controller;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.github.wxpay.sdk.WXPayConstants.SignType;
import com.github.wxpay.sdk.WXPayUtil;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;

@Controller
@RequestMapping("/WxPay")
public class WxPayController {
    protected final Logger logger = Logger.getLogger(WxPayController.class);
    // api密钥 在支付商户后台设置获取
    protected String apiKey = "";
    // 公众账号开发者appId
    protected String appId = "";
    // 微信支付分配的商户号
    protected String mchId = "";
    // APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP
    protected String requestIp = "";
    // 统一下单url
    protected String unifiedorderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";
    // 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
    protected String notifyUrl = "域名/WxPay/notifyUrl";

    // 统一下单生成二维码
    @RequestMapping("/getQRCode")
    public void getQRCode(HttpServletRequest request, HttpServletResponse response) throws Exception {
        Map<String, String> data = new HashMap<String, String>();
        data.put("appid", appId);
        data.put("mch_id", mchId);
        // 随机字符串,长度要求在32位以内
        data.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32));
        // 商品简单描述
        data.put("body", "充值中心-开通会员");
        // 商户系统内部订单号,要求32个字符内
        data.put("out_trade_no", String.valueOf(System.currentTimeMillis()));
        data.put("fee_type", "CNY");
        // 订单总金额,单位为分
        data.put("total_fee", "1");
        // APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP
        data.put("spbill_create_ip", requestIp);
        // 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
        data.put("notify_url", notifyUrl);
        // 取值如下:JSAPI,NATIVE,APP等
        data.put("trade_type", "NATIVE");
        // trade_type=NATIVE时(即扫码支付),此参数必传。此参数为二维码中包含的商品ID,商户自行定义。
        data.put("product_id", "1");

        String reqXmlStr = WXPayUtil.generateSignedXml(data, apiKey, SignType.MD5);

        try {
            HttpURLConnection conn = (HttpURLConnection) new URL(unifiedorderUrl).openConnection();
            conn.setRequestMethod("POST");
            conn.setDoOutput(true);
            BufferedOutputStream buffOutStr = new BufferedOutputStream(conn.getOutputStream());
            buffOutStr.write(reqXmlStr.getBytes());
            buffOutStr.flush();
            buffOutStr.close();
            // 获取输入流
            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line = null;
            StringBuffer sb = new StringBuffer();
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }

            System.out.println("接口响应返回结果为:" + sb.toString());
            // 接口返回的是xml格式字符串数据 转成map
            Map<String, String> resMap = WXPayUtil.xmlToMap(sb.toString());
            String qrcodeUrl = "";
            if (resMap.get("return_code").equals("SUCCESS") && resMap.get("result_code").equals("SUCCESS")) {
                qrcodeUrl = resMap.get("code_url");
            }
            System.out.println("支付二维码url为:" + qrcodeUrl);
            // zxing 生成二维码
            int width = 200;
            int height = 200;
            String format = "png";
            Hashtable hints = new Hashtable();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            BitMatrix bitMatrix = new MultiFormatWriter().encode(qrcodeUrl, BarcodeFormat.QR_CODE, width, height,
                    hints);
            OutputStream out = null;
            out = response.getOutputStream();
            MatrixToImageWriter.writeToStream(bitMatrix, format, out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 支付结果异步通知回调
    @RequestMapping("/notifyUrl")
    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();

        String receiveXml = sb.toString();
        String resXml = "";
        // 判断签名是否正确
        if (!WXPayUtil.isSignatureValid(receiveXml, apiKey)) {
            resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
                    + "<return_msg><![CDATA[签名失败]]></return_msg>" + "</xml> ";
        }

        // 接收到的是xml格式字符串数据 转成map
        Map<String, String> receiveMap = WXPayUtil.xmlToMap(receiveXml);
        if (receiveMap.get("return_code").equals("SUCCESS")) {
            // 业务处理 省略。。。

            // 通知微信.异步确认成功.必写.不然会一直通知后台.一定次数之后就认为交易失败了.
            resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
                    + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
        } else {
            resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
                    + "<return_msg><![CDATA[支付异常]]></return_msg>" + "</xml> ";
        }
        BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
        out.write(resXml.getBytes());
        out.flush();
        out.close();
    }
}

原文地址:https://www.cnblogs.com/zengnansheng/p/10389768.html

时间: 2024-11-12 20:42:28

微信支付之扫码支付实例的相关文章

微信支付之扫码支付、公众号支付、H5支付、小程序支付相关业务流程分析总结

前言 很久以来,一直想写一篇微信支付有关的总结文档:一方面是总结自己的一些心得,另一方面也可以帮助别人,但是因种种原因未能完全理解透彻微信支付的几大支付方式,今天有幸做一些总结上的文章,也趁此机会,将一年多以来的相关经验分享一下. 概述 1. 扫码支付 商户在pc端展示一个支付二维码,用户使用微信扫一扫功能,扫码后实现付款的支付方式. 2. 公众号支付 商户在微信APP内(微信浏览器)打开H5网页,通过微信支付实现付款的支付方式. 3. H5支付 商户在微信浏览器以外的手机浏览器打开H5网页,通

8. PHP接入微信的三种支付:APP支付、公众号支付、扫码支付

微信的支付逻辑与支付宝的支付有一些差别.为了让客户端忽略这些差别,统一调用.本sdk做了对应处理. # SDK调用 微信支付不同接口需要的参数会有差别.请大家在使用接口时,仔细查看文档. use Payment\ChargeContext; use Payment\Config; use Payment\Common\PayException; // 微信支付,必须设置时区,否则发生错误 date_default_timezone_set('Asia/Shanghai'); // 生成订单号 便

微信支付之扫码支付相关代码(Java)

最近开发网站过程,需要引入支付过程,第三方支付中最火的莫过于支付宝支付和微信支付,下边借助微信支付官网上的文档,写一下接入微信支付之扫码支付的流程 相对支付宝支付而言,微信支付的开发文档写的相当的low,demo写的一点都不简洁,下边写一下微信扫码支付的过程,这一过程中,需要注意的所涉及的实际业务是怎样的,根据实际情况结合业务进行引入,在进入正式开发之前,要申请微信支付的相关内容按照官网的操作进行即可,审核成功后,会得到appId,商户号,商户平台登录账号和密码 登录微信支付官网 https:/

支付宝支付之扫码支付(电脑网站支付)、H5支付(手机网站支付)相关业务流程分析总结

前言 在上一篇文章<微信支付之扫码支付.公众号支付.H5支付.小程序支付相关业务流程分析总结>中,分析和总结了微信支付相关支付类型的业务流程,这里作为与微信支付平起平坐不相伯仲的支付宝支付,当然也是每个公司少不了的第三方支付接入选择. 因此,本篇文章主要分析和总结支付宝支付中的扫码支付.H5支付相关业务流程. 概述 1. 电脑网站支付 电脑网站支付,也称扫码支付,是专门针对电脑而开发的一种支付方式,既在网页展示一个动态生成的支付二维码,用户通过手机支付宝扫码以后可实现支付功能的一种支付方式.

怎么对接个人收款支付接口(扫码支付)

怎么对接个人收款支付接口(扫码支付) 实现个人收款是一件很麻烦的事,可以通过PAYJX 支付平台 注册个人收款接口,帮助签约个人支付宝,微信支付接口(不需要营业执照),几分钟就可以开通,申请开通后,获取商户号和通信密钥,然后开始对接,上一章讲了收银台模式支付,本章主要说一下扫码支付 扫码支付请求步骤: 构建请求参数 POST 参数到请求地址 根据返回内容展示二维码 用户支付成功后接收异步通知 扫码对接 php代码如下: <?php $order = [ 'mchid' => 'xxxxxxxx

支付宝支付开发—当面付条码支付和扫码支付

关键字:支付宝 当面付 条码支付 扫码支付 二维码支付 订单查询 退款作者:方倍工作室 本文介绍支付宝中当面付下属的条码支付.扫码支付.订单查询.退款申请的集成开发过程. 本文分为以下五个部分: 条码支付和扫码支付介绍 申请应用 密钥生成及配置 API及SDK集成 条码支付.扫码支付.订单查询.退款申请 一.条码支付及二维码支付介绍 1. 条码支付 条码支付是支付宝给到线下传统行业的一种收款方式.商家使用扫码枪等条码识别设备扫描用户支付宝钱包上的条码/二维码,完成收款.用户仅需出示付款码,所有收

支付宝支付开发——当面付条码支付和扫码支付

关键字:支付宝 当面付 条码支付 扫码支付 二维码支付 订单查询 退款作者:方倍工作室原文: http://www.cnblogs.com/txw1958/p/alipay-f2fpay.html 本文介绍支付宝中当面付下属的条码支付.扫码支付.订单查询.退款申请的集成开发过程. 本文分为以下五个部分: 条码支付和扫码支付介绍 申请应用 密钥生成及配置 API及SDK集成 条码支付.扫码支付.订单查询.退款申请 注: 支付宝支付开发有一定的门槛,如果您愿意为知识付费来节省您宝贵的时间,请直接见底

微信支付----PC扫码支付(查询微信支付订单判断是否支付成功)

c#webapi建议前端轮番查询订单状态     #region  查询扫码订单状态         /// <summary>         /// 查询扫码支付状态         /// </summary>         /// <param name="out_trade_no">支付订单号</param>         /// <returns></returns>         [HttpGe

微信原生支付 Native扫码支付( V3.3.7 版本)

[尊重别人的劳动成果,转载请注明出处:一缕晨光工作室,www.wispdawn.com] 前言 辛苦研究三天,遇到各种困难,最终还是克服了,把我的理解和思路分享给需要帮助的人,如果你觉的好,请帮我分享一下,谢谢. 在没有做之前,我以为和支付宝,以及银联一样,会在官网找到相应的demo,照葫芦画瓢即可,没有什么复杂的,真正去做的时候,发现各种错误,很多时候都莫名其妙找不到北, 在网上搜了不知道多少遍,有V3版的,不过都是js api版本的,没有找到原生扫码支付,下了几个V2版本的微信支付c#dem