uniapp微信公众号h5端分享

!!!相对于微信小程序的分享比较繁琐

微信小程序分享可参考:uniapp微信小程序分享_停留的章小鱼的博客-优快云博客

效果图:

一、使用微信JS-SDK进行分享

1、绑定域名

先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。

!!!登录后可在“开发者中心”查看相应的接口权限。

2、安装模块依赖

npm install weixin-js-sdk --save

3、引入模块

 !!!mian.js引入并全局挂载

import wx from 'weixin-js-sdk'

Vue.prototype.$wx = wx

!!!单页面引入

import wx from "weixin-js-sdk";

4、通过 config 接口注入权限验证配置(需要后端配合,Java代码在文章最后,仅供参考)

                                !!!初始化页面时加载(onLoad、created)

//#ifdef H5
  uni.request({
    url: '请求地址',
    method: 'POST',
    data:'传参',
    header: {//配置请求头
      'Content-Type': this.$store.state.contentType,
      'Authorization' : this.$store.state.token
    },
    success: res => {
      if (res.statusCode < 500) {
        if (res.data.code === 200) {
          // console.log('res.data', res.data.data)
          wx.config({
            debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
            appId: res.data.data.appId, // 必填,公众号的唯一标识
            timestamp: res.data.data.timeStamp, // 必填,生成签名的时间戳
            nonceStr: res.data.data.nonceStr, // 必填,生成签名的随机串
            signature: res.data.data.sign, // 必填,签名,见附录1
            // surl: res.data.surl, //自己添加的,debug为true的时候可以网页打印出对应的URL是否正确
            jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData', 'openLocation']
          })
          setTimeout(() => {
            wx.ready(() => {
              //自定义“分享给朋友”及“分享到QQ”按钮的分享内容(1.4.0)
              wx.updateAppMessageShareData({
                title: '分享标题', // 分享标题
                desc: '', // 分享描述
                link: "分享链接",// 该链接域名或路径必须与当前页面对应的公众号 JS 安全域名一致
                imgUrl: '', // 分享图标
                success: res => {

                },
                cancel: function () {
                  // 用户取消分享后执行的回调函数
                }
              })
              //自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容(1.4.0)
              wx.updateTimelineShareData({
                title: '', // 分享标题
                link: "分享链接",// 该链接域名或路径必须与当前页面对应的公众号 JS 安全域名一致
                imgUrl: '', // 分享图标
                success: res => {
                 
                },
                cancel: function () {
                  // 用户取消分享后执行的回调函数
                }
              })
            })
          }, 500)
        }
      } else {
        console.error('服务器错误,请检查')
      }
    },
    fail: err => {
      uni.showToast({
        title: '请求失败',
        icon: 'error'
      })
    }
  })
  //#endif

二、使用jweixin-module依赖

1、安装jweixin-module
npm i jweixin-module
2、新建jwexin.js文件引入:(需要后端配合)
import store from './store.js' //引入vuex

//#ifdef H5
const jweixin = require('jweixin-module')
// H5分享
export const wxshare = options => {
  uni.request({
    url: options.url,
    method: 'POST',
    data: options.data || '',
    header: {//配置请求头
      'Content-Type': store.state.contentType,
      'Authorization' : store.state.token
    },
    success: res => {
      if (res.statusCode < 500) {
        if (res.data.code === 200) {
          // console.log('res.data', res.data.data)
          jweixin.config({
            debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
            appId: res.data.data.appId, // 必填,公众号的唯一标识
            timestamp: res.data.data.timeStamp, // 必填,生成签名的时间戳
            nonceStr: res.data.data.nonceStr, // 必填,生成签名的随机串
            signature: res.data.data.sign, // 必填,签名,见附录1
            // surl: res.data.surl, //自己添加的,debug为true的时候可以网页打印出对应的URL是否正确
            jsApiList: ['updateAppMessageShareData', 'updateTimelineShareData', 'openLocation']
          })
          setTimeout(() => {
            jweixin.ready(() => {
              //自定义“分享给朋友”及“分享到QQ”按钮的分享内容(1.4.0)
              jweixin.updateAppMessageShareData({
                title: options.share_data.title || '分享标题', // 分享标题
                desc: options.share_data.desc || '', // 分享描述
                link: options.share_data.link, // 分享链接
                imgUrl: options.share_data.imgUrl || '', // 分享图标
                success: res => {

                },
                cancel: function () {
                  // 用户取消分享后执行的回调函数
                }
              })
              //自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容(1.4.0)
              jweixin.updateTimelineShareData({
                title: options.share_data.title || '分享标题', // 分享标题
                link: options.share_data.link, // 分享链接
                imgUrl: options.share_data.imgUrl || '', // 分享图标
                success: res => {

                },
                cancel: function () {
                  // 用户取消分享后执行的回调函数
                }
              })
            })
          }, 500)
        }
      } else {
        console.error('服务器错误,请检查')
      }
    },
    fail: err => {
      uni.showToast({
        title: '请求失败',
        icon: 'error'
      })
    }
  })
}
  //#endif
3、在main.js中引入挂载:
import { wxshare } from "./utils/jweixin.js"
Vue.prototype.$wxshare = wxshare;
4、要分享的页面使用:

                                !!!初始化页面时加载(onLoad、created)

this.$wxshare({
	url:'channel/share/getShareInfo',
	data:{
	    url: window.location.href.split("#")[0],
		secret: this.$secret()
	},
	share_data:{
		title:'章小鱼',
		desc:'章小鱼的天',
		imgUrl:'/static/images/recommend/qrcode_icon_black.png',
		link: window.location.href, // 分享链接,该链接域名或路径必须与当前页面对应的公众号 JS 安全域名一致
	}
})

三、后端代码(我不懂后端哈)!!!仅供参考 20230727添加

1、设置WX_GZH_API

//公众号请求的地址
public static String WX_GZH_API = "https://api.weixin.qq.com/cgi-bin/";

 2、 获取token

        微信公众号开发中,不管你做啥操作,都需要这个token,并且有效时间两个小时失效,下面是java中获取token的代码:代码中APPIDAPPSECRET换成自己appid和secret

/**
     * 获取access_token的值
     * @return
     */
  @GetMapping("/getToken")
  public String getToken() {
      String token = "";
      String path = "token?grant_type=client_credential&appid=" + APPID + "&secret=" + APPSECRET;
      String body = HttpUtil.createGet(WX_GZH_API + path)
          .execute()
          .body();
      log.info("获取了token,返回数据" + body);
      JSONObject object = JSON.parseObject(body);
      //获取token
      token = object.getString("access_token");
      //失效时间
      String expires_in = object.getString("expires_in");
      //将token值的值放在redis里面
      redisService.setCacheObject("gzh_access_token", token,7190,TimeUnit.SECONDS);
      return token;
  }

3、获取api_ticket,这个是用在签名里面的,直接请求接口获取就行。

/**
     * 获取jsapi_ticket
     * @return
     */
    @GetMapping("/getJsapiTicket")
    public String getJsapiTicket() {
        //获取redis里面的token
        Object access_token = redisService.getCacheObject("gzh_access_token");
        if (access_token==null) {
            access_token = getToken();
        }
        String path = "ticket/getticket?access_token=" + access_token.toString() + "&type=jsapi";
        String body = HttpUtil.createGet(WX_GZH_API + path)
                .execute()
                .body();
        log.info("获取了JsapiTicket,返回数据" + body);
        JSONObject object = JSON.parseObject(body);
        //获取ticket
        String ticket = object.getString("ticket");
        //错误码
        Integer errcode = object.getInteger("errcode");
        if(errcode==0){
            //将ticket值的值放在redis里面
            redisService.setCacheObject("gzh_ticket", ticket,7190,TimeUnit.SECONDS);
        }
        return ticket;
    }

  4、生成签名:

/**
     * 签名
     */
    @GetMapping("/getSing")
    public ResponseResult getSing(String url){
        //从redis里面获取ticket
        Object ticket = redisService.getCacheObject("gzh_ticket");
        if(ticket==null){
            ticket = getJsapiTicket();
        }
        Map<String, String> ret = WeChatUtils.sign(ticket.toString(), url);
        JSONObject objectData = new JSONObject();
        for (Map.Entry entry : ret.entrySet()) {
            objectData.put(entry.getKey().toString(),entry.getValue());
        }
        objectData.put("appId", APPID);
        return ResponseResult.success(objectData);
    }

        签名的几个工具类如下所示:

//******************************************
    // 公众号网页开发
    //******************************************
    public static Map<String, String> sign(String jsapi_ticket, String url) {
        Map<String, String> ret = new HashMap<String, String>();
        String nonce_str = create_nonce_str();
        String timestamp = create_timestamp();
        String string1;
        String signature = "";
        //注意这里参数名必须全部小写,且必须有序
        string1 = "jsapi_ticket=" + jsapi_ticket +
                "&noncestr=" + nonce_str +
                "&timestamp=" + timestamp +
                "&url=" + url;
        System.out.println(string1);
        try
        {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(string1.getBytes("UTF-8"));
            signature = byteToHex(crypt.digest());
        }
        catch (NoSuchAlgorithmException | UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
        ret.put("url", url);
        ret.put("jsapi_ticket", jsapi_ticket);
        ret.put("nonceStr", nonce_str);
        ret.put("timestamp", timestamp);
        ret.put("signature", signature);
        return ret;
    }
    private static String byteToHex(final byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash)
        {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }
    private static String create_nonce_str() {
        return UUID.randomUUID().toString();
    }
    private static String create_timestamp() {
        return Long.toString(System.currentTimeMillis() / 1000);
    }

至此结束!后端代码 仅供参考!仅供参考!仅供参考!(前端表示不懂后端哈)

### UNI-APP 开发微信公众号 (H5) 并集成微信支付 #### 一、准备工作 为了在 Uni-app 中开发微信公众号 H5 应用并集成微信支付功能,需先完成如下准备: 1. **注册微信公众平台账号** - 获取 AppID 和 AppSecret。 2. **配置服务器域名** -微信公众平台上设置合法的业务域名、JS接口安全域名等必要信息[^1]。 3. **安装必要的插件和库文件** 对于微信支付的支持,在项目中引入 `wx.js` 文件用于调用微信 JS SDK 接口。同时确保已安装最新版本的 Vue CLI 工具以便更好地管理项目资源。 #### 二、实现流程 ##### (一)初始化环境变量 创建 `.env.development` 或者其他适合当前环境下的配置文件来保存敏感数据如 appId, mchId(商户号), key(密钥),这些参数将在后续请求过程中被使用到。 ```bash VUE_APP_WX_APP_ID=your_app_id_here VUE_APP_MCH_ID=your_merchant_id_here VUE_APP_API_KEY=your_api_key_here ``` ##### (二)获取预支付订单编号(prepay_id) 当用户确认付款金额后,前端应向自己的服务发起 POST 请求传递商品详情给后台处理逻辑;此时后负责生成交易单据并向 WeChat Pay API 发送 HTTPS 请求以获得 prepay_id 参数作为响应的一部分返回给客户应用。 注意:此过程涉及敏感操作建议采用 HTTPS 协议传输数据,并且严格按照官方文档说明构建签名字符串防止篡改攻击风险。 ##### (三)调起微信内嵌浏览器中的支付控件 收到有效的 prepay_id 后即可按照下述方式组装所需参数并通过 wx.chooseWXPay 方法启动内置 Webview 支付界面供顾客输入密码验证身份从而完成整个购物流程: ```javascript // 假设已经获得了prepay_id和其他必需的信息 const payParams = { "appId": process.env.VUE_APP_WX_APP_ID, "timeStamp": new Date().getTime(), "nonceStr": Math.random().toString(36).substr(2), "package": 'prepay_id=' + prepay_id_from_server,// 注意这里的拼接规则可能依据实际情况有所变化 "signType": "MD5", }; // 计算 sign 字段的具体方法请参照 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6 let stringA = Object.keys(payParams) .filter(key => payParams[key]) .map(key => `${key}=${encodeURIComponent(payParams[key])}`) .join('&'); stringA += '&key=' + encodeURIComponent(process.env.VUE_APP_API_KEY); payParams.sign = hex_md5(stringA.toUpperCase()); // 调用 chooseWXPay 进行支付 WeixinJSBridge.invoke( 'getBrandWCPayRequest', payParams, function(res){ if(res.err_msg === "get_brand_wcpay_request:ok"){ alert('支付成功!'); }else{ console.error(`支付失败:${res.err_code}`); } }); ``` 上述代码片段展示了如何利用 JavaScript 实现微信支付的核心部分——即通过 WeixinJSBridge 对象访问原生组件进而引导用户至最终结算环节。值得注意的是实际部署之前还需要针对不同场景做充分测试确保兼容性和稳定性。 #### 三、常见问题排查 如果遇到无法正常唤起支付窗口的情况,请检查以下几点: - 是否正确设置了 jsApiList 数组内的权限项; - 检查 URL 地址是否被列入了公众平台的安全白名单之中; - 确认所有参与计算 Sign 的字段都已被正确定义并且顺序无误; - 测试环境中使用的证书是否有效过期等问题也可能会引起异常行为。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值