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

一、背景介绍

最近接到一个项目,需要在微信公众号菜单中集成一个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:
### 回答1: 公众号微信支付是一种便捷的支付方式,为用户和商家提供了安全、便利的交易体验。完整的公众号微信支付demo源码包含支付和退款功能。 在支付功能方面,源码应包含以下主要模块: 1. 用户下单:用户在公众号中选择商品并下单,生成订单号和相应的支付金额。 2. 支付接口调用:源码需要在后台调用微信支付接口,将订单信息传递给微信支付平台,并生成一个支付链接。 3. 支付结果回调:在用户支付完成后,微信支付平台会回调指定的接口,通知商家支付结果。源码需要接收并处理这些支付结果,如更新订单状态、生成交易记录等。 在退款功能方面,源码应包含以下主要模块: 1. 退款申请:用户在公众号中选择需要退款的订单,提交退款申请,并提供相应的退款金额等信息。 2. 退款接口调用:源码需要在后台调用微信支付平台的退款接口,将退款申请信息传递给微信支付平台,并生成一个退款请求。 3. 退款结果回调:微信支付平台在退款成功或失败后,会回调指定的接口,通知商家退款结果。源码需要接收并处理这些退款结果,如更新订单状态、生成退款记录等。 为了保证支付和退款过程的安全性和可靠性,源码应考虑以下方面: 1. 数据加密:用户和商家的敏感数据在传输过程中应进行加密处理,确保数据的安全。 2. 异常处理:源码应对支付和退款接口调用过程中的异常情况进行处理,例如网络中断、支付平台系统错误等。 3. 数据验证:源码应对支付和退款申请的数据进行验证,确保数据的完整性和准确性。 4. 日志记录:源码应生成详细的日志记录,以便商家对支付和退款过程进行审计和追踪。 总之,一个完整的公众号微信支付demo源码应包含支付和退款功能,并考虑到安全性、可靠性和易用性的要求。 ### 回答2: 公众号微信支付是指通过微信公众号进行支付的一种支付方式。使用公众号微信支付的完整demo源码需要涵盖以下内容: 1. 微信公众号的认证和配置:需要先在微信公众平台上注册一个公众号,并进行认证和配置,获取相应的公众号APPID和APPSECRET。 2. 微信支付的配置:在公众号后台配置支付的相关参数,如商户号(MCH_ID)、支付密钥(API_KEY)等。 3. 生成预支付订单:用户在公众号内选择商品后,需要向微信支付接口发送统一下单请求,生成预支付订单,并获取到预支付ID(prepay_id)。 4. 生成支付签名:根据微信支付接口的要求,使用预支付ID、商户号、时间戳等参数生成支付签名。 5. 调起微信支付:在公众号内显示支付按钮,并将支付签名、订单号等信息传递给微信支付接口,调起微信支付页面供用户进行支付。 6. 支付结果回调:用户完成支付后,微信支付会发送支付结果通知给公众号后台,需要在后台进行相应的处理。 7. 退款功能:如果用户需要退款,需要向微信支付接口发送退款请求,并验证退款结果。 公众号微信支付的完整demo源码需要包含以上步骤的实现,其中关键的部分是生成预支付订单、生成支付签名和支付结果回调的处理。这些部分需要根据具体的开发语言和框架进行实现,同时也需要调用微信支付接口提供的API来完成支付和退款的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值