微信支付—微信H5支付「非微信内部浏览器-QQ/UC浏览器等」

前言

微信支付-微信H5外部浏览器支付本文
微信H5内部浏览器支付待写
PC端扫码支付待写

一直计划着写一写微信支付相关的文章,希望能加深一下自己的印象,拖了一天又一天…

最近终于空出时间来填坑了,我将文章分为微信H5外部浏览器支付微信H5内部浏览器支付PC端扫码支付三篇来写。

本篇是微信H5外部浏览器支付:支付时会唤起微信APP进行支付。

扫盲补充:关于微信H5支付,分为内部浏览器支付 + 外部浏览器支付,两者还是稍微有点点区别的,内部浏览器即在微信内打开网页,进行支付,支付调用由前端发起「JSSDK」;而外部浏览器「比如QQ浏览器等」则通过后台返回的 mweb_url 交由前端唤起微信APP发起支付操作,微信官方提供了个测试网页 https://wxpay.wxutil.com/mch/pay/h5.v2.php,可以在手机浏览器打开体验一番。

本文开发环境: Java + SpringBoot + IDEA + WxJava(开源SDK)

再多啰嗦几句,最开始并没有选择 WxJava 开源SDK,因为没有仔细阅读官方文档,反正各种报错,比如:支付验证签名失败 等等~,最后妥协不重复造轮子了,如下为正文。

1、 引入依赖包

pom.xml文件中引入 WxJava 依赖「本文使用的是3.3.0版本

<dependency>    <groupId>com.github.binarywang</groupId>    <artifactId>weixin-java-pay</artifactId>    <version>3.3.0</version></dependency>

2、基础配置

WxJava 提供了微信支付的Demo,可以参考 https://github.com/binarywang/weixin-java-pay-demo

2.1、增加支付配置信息

下面提供 application.ymlapplication.properties 两种格式,具体如下:

wx.pay.appId=#微信公众号或者小程序等的appidwx.pay.mchId=#微信支付商户号wx.pay.mchKey=#微信支付商户密钥wx.pay.notifyUrl=#支付成功回调URLwx.pay.keyPath=# p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)

# -----------------------------------------

wx:  pay:    appId: #微信公众号或者小程序等的appid    mchId: #微信支付商户号    mchKey: #微信支付商户密钥    notifyUrl: #支付成功回调URL    keyPath: # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)

补充:keyPath 用来指定证书路径,关于证书的用途:发红包/企业付款/退款等操作,本文不涉及,留空。

2.2、代码中的配置

一个是用来读取配置信息的实体类,一个是用来初始化支付SDKConfiguration

读取配置类:WxProperties.java

@Data@Configuration@ConfigurationProperties(prefix = "wx.pay")public class WxProperties {    /**     * 设置微信公众号或者小程序等的appid     */    private String appId;

    /**     * 微信支付商户号     */    private String mchId;

    /**     * 微信支付商户密钥     */    private String mchKey;

    /**     * apiclient_cert.p12文件的绝对路径,或者如果放在项目中,请以classpath:开头指定     */    private String keyPath;

    /**     * 微信回调接口地址     */    private String notifyUrl;}

初始化支付SDK类:WxConfig.java

@Configurationpublic class WxConfig {

    @Autowired    private WxProperties properties;

    @Bean    @ConditionalOnMissingBean    public WxPayService wxService() {        WxPayConfig payConfig = new WxPayConfig();        payConfig.setAppId(StringUtils.trimToNull(this.properties.getAppId()));        payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId()));        payConfig.setMchKey(StringUtils.trimToNull(this.properties.getMchKey()));        payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath()));        payConfig.setNotifyUrl(StringUtils.trimToNull(this.properties.getNotifyUrl()));        // 可以指定是否使用沙箱环境        payConfig.setUseSandboxEnv(false);        WxPayService wxPayService = new WxPayServiceImpl();        wxPayService.setConfig(payConfig);        return wxPayService;    }}

2.3、微信支付接口

微信非内部浏览器支付,比如在手机QQ浏览器中发起支付,会唤起微信APP进行支付操作,此时调用微信接口返回的是一个 URL,返回结果如下:

weixin://wxpay/bizpayurl?pr=IzX8nS

下方是获取支付URL的后端接口方法:

@RequestMapping(value = "createOrder", method = {RequestMethod.POST})public Result<Object> createQRCode(UserModel user, HttpServletResponse response,@RequestBody WechatOrderRequest obj) {

    Orders orders = null;    if (StringUtils.isNotBlank(obj.getOrderId())) {        orders = ordersService.searchOrder(user, obj.getOrderId());    } else {        orders = ordersService.createOrder(user, obj);    }    WechatOrderResponse wechatOrderResponse = new WechatOrderResponse();    wechatOrderResponse.setCodeUrl(wechatService.createOrderInfo(orders,user.getPayType()));    wechatOrderResponse.setOrderId(orders.getOrderId());    return ResultUtil.success(wechatOrderResponse);}

该方法仅供参考,上方方法中对订单id进行了一个判空操作,因为我这边有可能是用户未支付订单,继续支付的操作,代码主要是 wechatService.createOrderInfo 方法,实现如下:

public String createOrderInfo(Orders orders,String payType) {    WxPayMwebOrderResult result = null;    try {        WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();        orderRequest.setOutTradeNo(orders.getOrderId());        orderRequest.setBody("我是商品描述");        orderRequest.setTotalFee(orders.getAmount().multiply(new BigDecimal("100")).intValue());//金额需要扩大100倍:1代表支付时是0.01        orderRequest.setSpbillCreateIp(DispatchParams.getInstance().getWechatSpbillCreateIp());        orderRequest.setProductId(orders.getOrderId());        orderRequest.setTradeType(WxPayConstants.TradeType.MWEB);// h5网页支付        result = wxPayService.createOrder(orderRequest);        return result.getMwebUrl();    } catch (WxPayException e) {        logger.error("[微信支付异常] 异常", e);        // 抛出一个自定义全局异常「自己定义」        throw new CommonException(微信支付异常提示信息 , 状态码 );    }}

具体参数就不啰嗦了,详细请看官方支付文档。

综上,当前端调用 createOrder 方法,将 weixin://wxpay/bizpayurl?pr=IzX8nS 返回给前端,那么前端怎么调用呢?

下面是我的一个测试例子,其中 res.codeUrl 为后端返回的 URL

window.open(res.codeUrl, ‘_blank’);

是的,就是这么简单,新窗口打开就可以了,看一下运行调起微信的截图「我手机装了两个微信」:

支付成功后会回调后端接口,具体由后端参数配置的 return_url 控制。

2.4、微信回调接口

当支付完成后,微信会自动回调该接口,我们可以根据返回的信息修改订单状态,看一下方法,代码仅供参考:

@RequestMapping(value = "/notify")@ResponseBodypublic String notify(String body) throws Exception {

        WxPayOrderNotifyResult result = null;        try {            result = wxPayService.parseOrderNotifyResult(body);        } catch (WxPayException e) {            logger.error("[微信解析回调请求] 异常", e);            return WxPayNotifyResponse.fail(e.getMessage());        }        logger.info("处理微信支付平台的订单支付");        logger.info(JSONObject.toJSONString(result));

        String appid = result.getAppid();//应用ID        String attach = result.getAttach();//商家数据包        String bank_type =result.getBankType();//付款银行        Integer cash_fee = result.getCashFee();//现金支付金额        String fee_type = result.getFeeType();//货币种类        String is_subscribe = result.getIsSubscribe();//是否关注公众账号        String mch_id = result.getMchId();//商户号        String nonce_str = result.getNonceStr();//随机字符串        String openid = result.getOpenid();//用户标识        String out_trade_no = result.getOutTradeNo();// 获取商户订单号        String result_code = result.getResultCode();// 业务结果        String return_code = result.getReturnCode();// SUCCESS/FAIL        String sign = result.getSign();// 获取签名        String time_end = result.getTimeEnd();//支付完成时间        Integer total_fee = result.getTotalFee();// 获取订单金额        String trade_type = result.getTradeType();//交易类型        String transaction_id = result.getTransactionId();//微信支付订单号

        //如果成功写入数据库        if("SUCCESS".equals(return_code)) {// 如果微信返回的结果是success,则修改订单状态            Orders orders = ordersDao.selectByOrderId(out_trade_no);            // 验证签名            if(orders != null){                if(!"1".equals(orders.getOrderStatus())){//判断是否订单已经完成了                    // 判断金额是否跟数据库订单金额一致,放置人为修改                    if(orders.getAmount().multiply(new BigDecimal("100")).compareTo(new BigDecimal(total_fee)) == 0){                        //更新订单状态                        业务逻辑处理部分...                        return WxPayNotifyResponse.success("订单已经处理成功!");                    }else{                        logger.error("微信:金额不一致!");                        return WxPayNotifyResponse.fail("订单金额不一致");                    }                }else {                    return WxPayNotifyResponse.success("订单已经处理成功!");                }            }else{                return WxPayNotifyResponse.fail("商户订单号不匹配");            }        }        System.out.println("回调成功");        System.out.println("----返回给微信的xml:" + result);        return WxPayNotifyResponse.success("支付成功!");}

如上代码,微信返回的是 XML ,经过 wxPayService.parseOrderNotifyResult() 方法转换后得到 WxPayOrderNotifyResult 实体,具体参数我上边罗列出来了「尽管没用到」,然后就是修改数据库订单状态等操作。

最后

博客地址:https://www.cgblog.com/niceyoo

如果觉得这篇文章有丶东西,不放关注一下我,关注是对我最大的鼓励~

18年专科毕业后,期间一度迷茫,最近我创建了一个公众号用来记录自己的成长。

原文地址:https://www.cnblogs.com/niceyoo/p/12232215.html

时间: 2024-08-04 11:45:19

微信支付—微信H5支付「非微信内部浏览器-QQ/UC浏览器等」的相关文章

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

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

微信公众号H5支付-JAVA版

微信开发之微信公众号H5支付-JAVA版 引子 从事JAVA开发一年多了,一直都在看博客园,CSDN的博客,从很多前人哪里学习了很多,突然觉得自己也要尽一份力,写点博客自己给自己做做记录,也给要开发微信人提提醒少遇点坑. 很多人开发微信的时候,总是在抱怨微信的开发文档很坑,里面的参数和使用方式很含糊,其实有时候自己想想,如果自己去研发API的时候,是否能够做的比微信更好呢?,大师都有一颗虔诚学徒的心,希望这篇文档能给予从事微信公众号H5支付焦头烂额的朋友,一点帮助. 一.前言 先给大家提提从事微

微信公共号H5支付。

1.接受支付信息. /** * 发起支付请求 * @return [type] [description] */ function pay($openid){ $nonce_str = $this->rand_code(); //调用随机字符串生成方法获取随机字符串 $data['appid'] = $this->appid; //appid $data['mch_id'] = $this->mch_id ; //商户号 $data['body'] = 'ceshi'; $data['s

H5版如何在微信外(非微信浏览器)进行微信支付技术方案

官方是支持在非微信内置浏览器中调起微信支付的!H5支付是基于公众号基础开发的一种非微信内浏览器支付方式(需要单独申请支付权限),可以满足在微信外的手机H5页面进行微信支付的需求.同时,由于H5链接传播十分方便.来源不易追踪,商户需要特别注意做好防钓鱼.防刷单的处理,控制风险. 流程原理 接口说明 (1)用户打开商户H5网页选购商品,生成支付订单:(2)商户调用[统一下单]接口(接口中trade_type需定义为WAP),获得预支付交易会话标识prepayid:(3)商户按照微信H5支付协议生成d

asp.net core 微信支付工具类(H5支付,扫码支付,公众号支付,app支付)之2-H5支付

上一篇说到微信扫码支付,今天来分享下微信H5支付,适用场景为手机端非微信浏览器调用微信H5支付惊醒网站支付业务处理.申请开通微信H5支付工作不多做介绍,直接上代码. 首先是微信支付业务类(WxPayService)中的方法,传上必要的参数,该方法将会构造请求XML字符串到微信api接口,H5支付用到的是返回XML参数的mweb_url的值,控制器中的Aciton方法调用该业务层方法得到mweb_url的值,此时,前端ajax调用控制器返回mweb_url值,直接将window.localtion

微信H5支付demo

首先我们必须得在微信公众平台和微信商业平台那边配置好相关配置 1.注册微信服务号,开通微信支付权限绑定微信商业平台(这个具体怎么操作我就不说了) 2.获取应用(公众号)appid.应用(公众号)秘钥.商户号.商户API秘钥这四个配置信息 3.微信商业平台开通H5支付权限,配置支付域名(是要ICP备案的域名), 4.微信公众号配置白名单(也就是服务器ip) 5.开始写代码实现微信H5支付了(首先我们得理清H5支付跟其他类型支付的区别) 5.1.直接用微信客户段支付的那个是JSAPI支付模式 5.2

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

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

支付宝H5支付demo

支付宝H5支付 首先我们必须注册一个支付宝应用(本案例就直接用支付宝的沙箱环境,这个沙箱也就是支付宝提供给开发者的一个测试环境) 登录地址:https://open.alipay.com/platform/home.htm 1.怎么注册一个支付宝应用?看图(至于应用里面需要的资料你就跟着填就ok了,我就不多讲了,关于公钥秘钥这些,支付宝也有它自己的工具自动生成) 2.怎么获取沙箱环境?(看图) 就这样,支付宝的基本配置我们都能get到了,下面开始写代码吧! 3.思路描述 支付宝的h5支付比微信的

第四方支付、聚合支付介绍

第四方支付是聚合支付公司整合支付宝支付.×××支付.银联支付.京东钱包.QQ钱包.百度钱包等第三方支付接口,便于商户一次接入,享用多个支付接口.第四方支付公司面向移动互联网开发者提供×××支付.支付宝.银联支付.京东钱包.QQ钱包.百度钱包等主流支付渠道代接入服务,一站式解决支付接入.信息核验.数据分析等交易问题.商户可通过第四方支付公司申请×××扫码支付.×××H5支付.×××APP支付.支付宝等支付.商户直接与银行签订支付协议,商户接入银行支付系统,由银行与商户进行结算. 优点: 1.集成了