微信支付之扫码支付

选择支付模式

点开链接先去了解一下微信支付模式:

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=2_1

web一般选择都是扫码支付。

类似于这个:

准备账号

公众账号ID(AppID)

首先要申请一个公共账号,最好申请的时候就是服务号,因为微信支付的前提必须是服务号

如果是公众号需要先申请验证才能升级为服务号。

下面链接可以帮助你去找到这个账号:

http://jingyan.baidu.com/article/22fe7ced23fa183002617fa1.html

应用秘钥 (AppSecret)

在公共号平台上找

下面链接可以帮助你去找到这个账号:

http://jingyan.baidu.com/article/22fe7ced23fa183002617fa1.html

注意:

以上两个账号都可以在类型为服务号的公众号上找到,下面的两个账号就必须要在商户平台上才可以找到。

大概步骤:

一、公众号为服务号

http://jingyan.baidu.com/article/fea4511a7eaf2cf7bb9125a7.html

二、申请微信认证

http://kf.qq.com/faq/120911VrYVrA150929Fjqeei.html

三、申请扫码支付

升级完之后左侧菜单会多一个“微信支付”选项

第三步成功之后会收到一个邮件,邮件中会有登录商户平台的账号和密码

商户id(mch_id)

申请支付成功之后登录商户平台就可以看到这个值了。

API秘钥 (api_key)

这个必须要登录商户平台去设置。

以上两个账号的值可以参考下面的链接:

http://help.ecmoban.com/article-2085.html

查看扫码支付API了解流程

https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5

进入开发

引入相关的jar包

<!-- 生成二维码所需的jar包 开始 -->
        <dependency>
              <groupId>com.uqihong</groupId>
              <artifactId>qdcode</artifactId>
              <version>1.0.0</version>
        </dependency>
        <dependency>
              <groupId>com.uqihong</groupId>
              <artifactId>qdcodeSwetake</artifactId>
              <version>1.0.0</version>
        </dependency>
        <!-- 生成二维码所需的jar包 结束 -->
<!-- 微信支付需要的jar包 -->
        <dependency>
            <groupId>xmlpull</groupId>
            <artifactId>xmlpull</artifactId>
            <version>1.1.3.1</version>
        </dependency>
        <dependency>
            <groupId>xpp3</groupId>
            <artifactId>xpp3</artifactId>
            <version>1.1.4c</version>
        </dependency>
        <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.4.7</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>fluent-hc</artifactId>
            <version>4.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient-cache</artifactId>
            <version>4.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
            <version>4.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.3.5</version>
        </dependency>

调用预生成订单API获取到扫码链接


    /**
     * 创建预支付订单
     *
     * @param goodsName 商品名称
     * @param orderId   订单id
     * @param payPrice  支付价格
     *
     * @return 微信支付二维码链接
    */
    public String createPrePayOrder(String goodsName, String orderId, double payPrice) {
        return dowithWxReturn(sendReqGetPreOrder(goodsName, orderId, payPrice));
    }

    /**
     * 处理微信返回
     * <p>
     * 处理的是调用微信预支付订单的返回值
     *
     * @param result 微信的返回值
     *
     * @return 二维码链接
     */
    private String dowithWxReturn(String result) {
        String codeUrl = "";
        Map<String, Object> weixinPrepayInfo = MapUtil.map();
        try {
            weixinPrepayInfo = XMLParser.getMapFromXML(result);
            String return_code = (String) weixinPrepayInfo.get("return_code");
            if ("SUCCESS".equals(return_code)) {
                codeUrl = (String) weixinPrepayInfo.get("code_url");
                if (Util.isEmpty(codeUrl)) {
                    throw ExceptionUtil.bEx(ConvertUtil.obj2str(weixinPrepayInfo.get("err_code_des")));
                }
                return codeUrl;
            } else {
                throw ExceptionUtil.bEx("预支付失败");
            }
        } catch (Exception e) {
            logger.error(e.getMessage());
            ExceptionUtil.bEx("调用微信预支付接口出错");
        }
        return codeUrl;
    }
    /**
     * 发送预生成订单请求
     *
     * @param goodsName 商品名称
     * @param orderId 订单号
     * @param payPrice 支付价格
     *
     * @return 微信处理结果
    */
    private String sendReqGetPreOrder(String goodsName, String orderId, double payPrice) {
        ExceptionUtil.checkEmpty(orderId, "订单id不能为空");
        ExceptionUtil.checkEmpty(goodsName, "商品名称不能为空");
        Map<String, Object> params = MapUtil.map();
        //公共账号id
        params.put("appid", WeixinH5PayConfigure.APPID);
        //商户id
        params.put("mch_id", WeixinH5PayConfigure.MCH_ID);
        //设备号
        //ctrl+alt+T
        params.put("device_info", "WEB");
        //随机字符串
        params.put("nonce_str", RandomUtil.randomString(randomNumLength));
        //商品描述
        params.put("body", goodsName);
        //订单编号
        params.put("out_trade_no", orderId);
        //金额
        params.put("total_fee", AmountUtils.changeY2F(payPrice));
        //回调地址
        params.put("notify_url", WeixinH5PayConfigure.NOTIFY_ACTIVITY_URL);
        params.put("trade_type", WeixinH5PayConfigure.TRADE_TYPE);
        //签名
        String sign = Signature.getSign(params, WeixinH5PayConfigure.API_KEY);
        params.put("sign", sign);
        return HttpRequest.sendPost(WeixinH5PayConfigure.PAY_UNIFIED_ORDER_API, params);
    }

根据扫码链接生成二维码

   /**
     * 获取二维码
     *
     * @param orderId 订单id
     *
     * @return 二维码的地址
    */
    public Object getQrCode(long orderId) {
        ExceptionUtil.checkId(orderId, "订单id不能为空");
        return getWxCodeImagePath(getWxPayCodeUrl(orderId));
    }
    /**
     * 获取微信二维码支付的链接
     *
     * @param orderId 订单号
     *
     * @return 二维码支付的链接
    */
    private String getWxPayCodeUrl(long orderId) {
        OrderEntity order = orderBaseService.getWithEx(orderId);
        PackageEntity pk = packageBaseService.getWithEx(order.getPackageId());
        //double paymentPrice = 0.1;
        double paymentPrice = order.getPaymentPrice();
        String wxPayCodeUrl = wxPayService.createPrePayOrder(pk.getName(), ConvertUtil.obj2str(orderId), paymentPrice);
        return wxPayCodeUrl;
    }
    /**
     * 获取微信二维码的图片地址
     *
     * @param wxPayCodeUrl 微信二维码链接
     *
     * @return 含有微信扫码支付的二维码地址
    */
    private String getWxCodeImagePath(String wxPayCodeUrl) {
        String qrCodePath = QrcodeUtil.getQrCodePath(kvConfig, UqihongUploadFoldType.QRCODE);
        QrcodeUtil.encoderQRCode(wxPayCodeUrl, qrCodePath);
        return QrcodeUtil.getRelationPath(qrCodePath, kvConfig);
    }

将生成的二维码展示给用户

第二步中的getQrCode()方法返回的就是图片的地址,直接在页面中使用img标签展示给用户就行。

编写微信支付完成的回调逻辑

    /**
     * 微信提醒
     * <P>
     * 微信支付成功的回调
     *
     * @throws Exception
     */
    public void wxPayFinishNotify() throws Exception {
        HttpServletRequest request = Mvcs.getReq();
        HttpServletResponse response = Mvcs.getResp();
        String responseString = getWeiXinResponseContent(request);
        PrintWriter out = response.getWriter();
        String resp = "";
        String signKey = WeixinH5PayConfigure.API_KEY;
        boolean verify = Signature.checkIsSignValidFromResponseString(responseString, signKey);
        if (!verify) {
            resp = "签名验证失败";
            out.write(resp);
            out.close();
            return;
        }
        Map<String, Object> map = XMLParser.getMapFromXML(responseString);
        String result_code = ConvertUtil.obj2str(map.get("result_code"));
        if (!"SUCCESS".equalsIgnoreCase(result_code)) {
            resp = PayCommonUtil.getResponseXML("ERROR", "ERROR");
            out.write(resp);
            out.close();
            return;
        }
        resp = handleOrder(map);
        out.write(resp);
        out.close();
    }
    @Aop("txDb")
    private String handleOrder(Map<String, Object> map) throws Exception {
        String resp = PayCommonUtil.getResponseXML("SUCCESS", "OK");
        //微信支付订单号
        String transaction_id = ConvertUtil.obj2str(map.get("transaction_id"));
        //支付完成时间
        String time_end = ConvertUtil.obj2str(map.get("time_end"));
        //订单号
        String out_trade_no = (String) map.get("out_trade_no");
        if (Util.isEmpty(transaction_id) || Util.isEmpty(time_end) || Util.isEmpty(out_trade_no)) {
            resp = PayCommonUtil.getResponseXML("ERROR", "参数错误,微信支付订单号、支付完成时间、订单号均不能为空");
            return resp;
        }
        OrderEntity order = orderBaseService.get(ConvertUtil.obj2long(out_trade_no));
        if (Util.isEmpty(order)) {
            resp = PayCommonUtil.getResponseXML("ERROR", "订单不存在");
            return resp;
        }
        //判断订单状态,避免重复处理
        int orderStatus = order.getStatus();
        if (OrderStatusEnum.FINISHED.intKey() == orderStatus) {
            return resp;
        }
        if (OrderStatusEnum.WAITING_PAY.intKey() == orderStatus) {
            //在这里编写你的逻辑即可
                                。。。。。。

        }
        return resp;
    }

资源

https://my.oschina.net/xiaohui249/blog/656511 扫码支付的demo

http://www.cnblogs.com/zhengbin/p/6777639.html 生成二维码

原文地址:https://www.cnblogs.com/wangsen/p/8257635.html

时间: 2024-10-08 01:19:48

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

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支付、小程序支付相关业务流程分析总结

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

支付宝支付之扫码支付(电脑网站支付)、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集成 条码支付.扫码支付.订单查询.退款申请 注: 支付宝支付开发有一定的门槛,如果您愿意为知识付费来节省您宝贵的时间,请直接见底

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

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

微信公众号 扫码支付 模式二 demo

扫码支付 本文附有代码,在下方,如果不熟悉场景的可以看看下面的场景介绍 场景介绍 官网介绍地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1 用户扫描商户展示在各种场景的二维码进行支付. 步骤1:商户根据微信支付的规则,为不同商品生成不同的二维码(如图6.1),展示在各种场景,用于用户扫描购买. 步骤2:用户使用微信"扫一扫"(如图6.2)扫描二维码后,获取商品支付信息,引导用户完成支付(如图6.3). 图6

微信支付之扫码支付(java版 native原生支付)

本文直接从代码调用微信扫码支付讲起.账号配置,参数生成等请参考官方文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1 微信扫码支付.简单来说,就是你把微信支付需要的信息,生成到二维码图片中.通过微信扫一扫,发起支付.我们需要做的就是二件事: 一是:按照微信扫码支付规则生成二维码信息. 二是:微信没有提供生成二维码图片的接口.需要我们自己把二维码信息生成到二维码图片中. 1.模式选择: 微信扫码支付,有两种模式,文档中有