首页 > 其他分享 >基于公众号的微信支付步骤详解,附全部代码

基于公众号的微信支付步骤详解,附全部代码

时间:2024-03-26 17:02:28浏览次数:42  
标签:商户 微信 步骤 详解 onBridgeReady orderguid 支付 data

一、背景介绍

最近接到一个项目,需要在微信公众号菜单中集成一个vue系统,支持下单、微信支付等功能,下面就微信支付核心部分做一下记录。

二、对接流程图

1)对接流程图

2)涉及接口

(接口地址:API列表-JSAPI支付 | 微信支付商户平台文档中心

三、微信支付相关申请及配置

在正式编码之前,需要进行各种微信相关的申请和配置,下面简单介绍一下

1)注册微信商户平台账号

注册地址:接入微信支付 - 微信商户平台

2)微信商户平台配置

微信商户平台接口文档:微信支付接入指引 - 微信支付商户平台

按接口文档配置各种参数(内容很多,仔细看)

3)注册微信公众号账号

地址:https://mp.weixin.qq.com/cgi-bin/registermidpage?action=index&lang=zh_CN

4)微信公众号配置

域名配置

微信公众号与商户平台建立关联

四、编码相关

1、微信支付无非是接口对接,逻辑其实不复杂,复杂的是签名及验签,这个是编码前需要重点突破的点

2、在微信支付对接中证书是有2份的,如流程图中所示:微信商户服务平台下发的证书、定期获取的平台证书

下图中的证书全部来自:微信商户服务平台下发的证书(证书查看地址:证书查看,可通过连接查看证书内容)

 1)前端:JSAPI下单及调起支付代码

<template>
  <div style="width:100%;" class="OrderPayClass" >
      <IfcaNavbar :navTitle="'微信支付'"></IfcaNavbar>
      <div style="width:100%;margin-top:50px">
        正在转向中,请稍候...
        <br>
        <div style="width:100%;">
        如果系统长时间无响应,请<div @click="GoToDetail()" style="color:blue">单击此处</div>查看订单状态
        </div>
      </div>
  </div>
</template>

<style scoped lang="scss"> 
 .OrderPayClass {
     .tab-panel {
         display: flex;
         background-color: #fff;
         padding: 10px 0px;

         .tab {
             flex: 1;
             text-align: center;

             .tab-name {
                 margin-top: 7px;
             }
         }
     }

 
 }
</style>

<script>
import IfcaNavbar from "../../components/IfcaNavbar.vue";
import { reactive, ref, createApp, getCurrentInstance } from 'vue'
import { useRouter } from 'vue-router'
import { postHttp ,postWeiXinApiHttp} from "../../assets/js/httpApi.js";
import { showLoadingToast, closeToast, showFailToast, showToast, showDialog, showSuccessToast, Uploader } from 'vant';

export default {
    components: {
        IfcaNavbar
    },
   data() {
      const orderguid = this.$route.query.orderguid;
      const wxcode = this.$route.query.code;
      const wxopenid = this.$route.query.wxopenid;

      return {
            orderguid:orderguid,
            wxcode: wxcode,
            wxopenid: wxopenid,
      }
    },

    created() {
        this.WXPayCore();
    },

    methods: {

        GoToDetail() {//跳转详情查看支付进度
            this.$router.push({
                path: "/OrderDetial",
                query: { orderId:  this.orderguid  }
            })
        },

        /**
         * 微信JSAPI下单
         */
        WXPayCore() {
            let params = {
              orderguid:this.orderguid,
              wxcode: this.wxcode,
              openid:this.wxopenid,
              requesturl:location.href//备用,暂时没用到
            }

            showLoadingToast({
                message: '正在处理,请稍后...',
                forbidClick: true,
                overlay: true,
                duration: 0,
                loadingType: 'spinner',
            });

            console.log(JSON.stringify(params));

            this.$postWeiXinApiHttp("AppWebService", "WXPaymentJsApi", JSON.stringify(params)).then(e => {

                closeToast();

                console.log(e.data.Success);

                //showFailToast('e.data.Success;'+e.data.Success);

                if (e.data.Success) {
                    let dataSource = JSON.parse(e.data.Data);
                     
                    //showFailToast('dataSource.appId;'+dataSource.appId);

                    console.log(dataSource);

                    this.callpay(dataSource);

                } else {
                    showFailToast('操作失败,请重试:'+e.data.Message);
                }

            }).catch(err => {

                console.log(`AppWebService,WXPaymentJsApi 接口请求失败。`);

                showFailToast('操作失败,请重试;');
            })
        },

        callpay (data){
                    if (typeof WeixinJSBridge == "undefined") {
                        if (document.addEventListener) {
                            //监听没起作用
                            document.addEventListener('WeixinJSBridgeReady', this.onBridgeReady(data), false)
                        } else if (document.attachEvent) {
                            document.attachEvent('WeixinJSBridgeReady', this.onBridgeReady(data))
                            document.attachEvent('onWeixinJSBridgeReady', this.onBridgeReady(data))
                        }
                    } else {
                        this.onBridgeReady(data)
                    }
           },

       /* eslint-disable */
       //这里的代码不会被eslint规则校验
        onBridgeReady(data) {

          console.log("onBridgeReady:"+data);
          console.log("onBridgeReady:data.package:"+data.package);

          WeixinJSBridge.invoke('getBrandWCPayRequest', {
            "appId": data.appId,     //公众号ID,由商户传入     
            "timeStamp": data.timeStamp,     //时间戳,自1970年以来的秒数     
            "nonceStr": data.nonceStr,      //随机串     
            "package": data.package,
            "signType":data.signType,     //微信签名方式:     
            "paySign": data.paySign//微信签名 
          },
          function(res) {
            if (res.err_msg == "get_brand_wcpay_request:ok") {
            // 使用以上方式判断前端返回,微信团队郑重提示:
            //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
            
            //返回订单详情页面
            setTimeout(() =>{
               window.location.href="https://xxx/homeshopping/#/OrderDetial?orderId="+data.orderGuid;
            }, 5000);

            //this.$router.push({
            //    path: "/OrderList",
            //    query: { type: "0" }
            //})

  

标签:商户,微信,步骤,详解,onBridgeReady,orderguid,支付,data
From: https://blog.csdn.net/weixin_42178753/article/details/135413898

相关文章

  • js 非常好用且优雅的步骤校验、提交校验、自定义校验写法
    很多form表单和其它场景,在提交前或进入下一步前需要校验逻辑,这里总结了一个通用方法: constform={name:'',age:20,time:['2100-01-01','2100-01-01']}constvalidForm=()=>{//校验状态总结let......
  • iOS开发优势解析,费用探究以及软件开发详解
    摘要本文探讨了iOS开发的优势、费用以及软件开发方面的相关内容。通过分析iOS开发所采用的编程语言、开发环境、用户界面设计、应用审核流程以及应用领域等方面,展示了iOS开发的诸多优势和特点。虽然iOS开发具有高用户体验、统一的硬件和软件环境、良好的市场份额等优势,但也存在着......
  • 面对对象10:Super详解
    1.person类packagecom.oop.demo05;//在Java中,所有的类都默认直接或间接继承Object类//父类publicclassPerson{//无参默认构造器,当方法被重写时,需要被显示定义publicPerson(){System.out.println("Person无参执行了!");}protectedStri......
  • Python之Scrapy爬虫框架安装及使用详解
    声明文章所涉及的内容仅为学习交流所用。前言:        Scrapy是用Python实现的一个为了采集网站数据、提取结构性数据而编写的应用框架。常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。通常我们可以很简单的通过Scrapy框架实现一个爬虫,抓取指......
  • 不登录微信怎么查看电脑里的微信聊天DAT图片
    不登录微信怎么查看电脑里的微信聊天DAT图片:https://blog.csdn.net/m0_69862284/article/details/127436843?ops_request_misc=&request_id=&biz_id=102&utm_term=MsgAttach&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-5-127436843.142^v......
  • 核心子方法10: registerListeners()方法详解
    先总结: 该方法主要用于注册监听器, 在所有注册的bean中查找listener监听器bean,注册到消息广播器中1.遍历应用程序中存在的监听器集合,并将对应的监听器添加到监听器的多路广播器中for(ApplicationListener<?>listener:getApplicationListeners()){get......
  • JAVA接口详解
    一,抽象类抽象类为用abstract修饰的类1,定义的成员变量与普通的类没有区别2,抽象类不可以被实例化3,当一个类不具体描述某个对象时,可以定义为抽象类4,如果一个类包含抽象方法,则这个类必须是抽象类,没有抽象方法,也可以被称为抽象类5,一个方法可以被修饰为abstract,这个方法可以不......
  • 数据结构——二叉搜索树详解
    一、二叉搜索树定义二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:1.非空左子树上所有节点的值都小于根节点的值。2.非空右子树上所有节点的值都大于根节点的值。3.左右子树也都为二叉搜索树。如下图所示:二、二叉搜索树的操作二叉搜索树结构:t......
  • 函数是什么?C++函数详解!
    1、函数的声明和定义在复杂的程序中,如果全部的代码都写在main函数中,main函数体将非常庞大臃肿。把任务分工到其它的函数中,main函数只负责程序的核心流程,具体的任务由其它函数完成。这种思想就是模块化编程。声明和定义函数的语法:返回值的数据类型函数名(参数一的数据类型......
  • hbuilderx打包苹果证书获取步骤
    简介:目前app开发,很多企业都用H5框架来开发,而uniapp又是这些h5框架里面最成熟的,因此hbuilderx就成为了开发者的首选。然而,打包APP是需要证书的,那么这个证书又是如何获得呢?生成苹果证书相对复杂一些,所以这里我重点说下ios证书的生成流程目前app开发,很多企业都用H5框架来......