微信公众号分享自定义图片和文字

发布时间:2024年01月11日

步骤一:绑定域名

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

备注:登录后可在“开发者中心”查看对应的接口权限。

步骤二:引入JS文件

在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.6.0.js

如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:http://res2.wx.qq.com/open/js/jweixin-1.6.0.js (支持https)。

备注:支持使用 AMD/CMD 标准模块加载方法加载

步骤三:通过config接口注入权限验证配置

wx.config({
  debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  appId: '', // 必填,公众号的唯一标识
  timestamp: , // 必填,生成签名的时间戳
  nonceStr: '', // 必填,生成签名的随机串
  signature: '',// 必填,签名
  jsApiList: ['updateAppMessageShareData','updateTimelineShareData'] // 必填,需要使用的JS接口列表
});

备注:以下参数需要后端开发提供接口返回给前端)

步骤四:通过ready接口处理成功验证

wx.ready(function(){
  // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});

前端代码:

 wx.ready(function(){
  // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
        wx.updateAppMessageShareData({ 
            title: '{$info.good_name}', // 分享标题
            desc: '{$info.good_sub_name}', // 分享描述
            link: '{$wechatData.shareUrl}', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: '{$info["good_cover_img"]}', // 分享图标
            success: function () {
              // 设置成功
            }
        });
        
        wx.ready(function () {      //需在用户可能点击分享按钮前就先调用
          wx.updateTimelineShareData({ 
            title: '{$info.good_name}', // 分享标题
            link: '{$wechatData.shareUrl}', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: '{$info["good_cover_img"]}', // 分享图标
            success: function () {
              // 设置成功
            }
          })
        });
    });

步骤五:通过error接口处理失败验证

wx.error(function(res){
  // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});

后端参考代码:

<?php


namespace app\mall\service;


use think\Log;
use think\Cache;
use WeChatPay\Formatter;
use app\mall\service\WeChatPayService;

/**
 * 微信其他接口
 */ 
class WeChatService
{
    /**
     * @var array|mixed
     */
    private $config;
    /**
     * @var \WeChatPay\BuilderChainable
     */
    private $instance;
    
    private $merchantPrivateKeyInstance;

    public function __construct($config = [])
    {
        $this->config = $config ? $config : config('WX_PAY');
    }
    
    // 获取 前端分享需要的数据
    public function getData($url)
    {
        $timeStamp = (string)Formatter::timestamp();
        $nonceStr =  Formatter::nonce();
        
        $data = [];
        $data['noncestr'] = $nonceStr; // 生成签名的随机串
        $data['jsapi_ticket'] = $this->getJsapiTicket();
        $data['timestamp'] = $timeStamp; // 时间戳
        $data['url'] = $url; // 
        $signature = $this->getSign($data);
        $data['signature'] = $signature;
      
        return $data;
    }
    
    //作用:生成签名
	public function getSign($Obj) {
        //去空
		$Parameters = array_filter($Obj);
		//签名步骤一:按字典序排序参数
		ksort($Parameters);
		$string = $this->formatBizQueryParaMap($Parameters, false);
		//签名步骤二:sha1加密
		$string = sha1($string);
		return $string;
	}
    
    ///作用:格式化参数,签名过程需要使用
	public function formatBizQueryParaMap($paraMap, $urlencode) {
		$buff = "";
		ksort($paraMap);
		foreach ($paraMap as $k => $v) {
			if ($urlencode) {
				$v = urlencode($v);
			}
			$buff .= $k . "=" . $v . "&";
		}
		$reqPar;
		if (strlen($buff) > 0) {
			$reqPar = substr($buff, 0, strlen($buff) - 1);
		}
		return $reqPar;
	}
    
    
    // 获取 Access token
    public function getAccessToken()
    {
        $APPID = $this->config['app_id'];
        $APPSECRET = $this->config['secret'];

        $accessToken = Cache::get('access_token');
        if ($accessToken) {
           return $accessToken;
        }
        
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$APPID."&secret=".$APPSECRET;
        $result = curlGetRequest($url);
        if (!isset($result['access_token'])) {
            return false;
        }
       
        $expire = $result['expires_in'] - 5 * 60;
        $accessToken = $result['access_token'];
        
        Cache::set('access_token',$accessToken,$expire);
        return $accessToken;
    }
    
    
     // 获取 jsapi_ticket
    public function getJsapiTicket()
    {
        $jsapiTicket = Cache::get('jsapi_ticket');
        if ($jsapiTicket) {
           return $jsapiTicket;
        }
        $accessToken = $this->getAccessToken();
        $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$accessToken."&type=jsapi";
        $result = curlGetRequest($url);
        if ($result['errmsg'] != 0) {
            return false;
        }
       
        $expire = $result['expires_in'] - 5 * 60;
        $jsapiTicket = $result['ticket'];
        
        Cache::set('jsapi_ticket',$jsapiTicket,$expire);
        return $jsapiTicket;
    }


}
文章来源:https://blog.csdn.net/ManNiaoQinFen/article/details/135521631
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。