PHP&&微信分享朋友(朋友圈),很久没开发这功能了,练练手

微信朋友与分享朋友圈,好久没弄了,趁有时间小玩了一下。技术的东西你不经常去用,很快就会忘记了。

H5页面分享到朋友或者朋友圈,其实是很容易的,但是对于没弄过的友友,下面的详细过程你可以仔细看看咯。

下面来看看具体流程

要分享到朋友(朋友圈),首先你要到微信公众号,网页要授权先。如图,在接口权限表里。

接口安全域名那里也填写了吧,用来调用微信开放的JS接口

配置好后,接下来就码代码了。网上很少有网页带上分享的代码,这里给大家先分享了。我写的是饿了么与美团的分享页面。

模板文件

链接:https://pan.baidu.com/s/1vcM4TfYhBWP8JfkzCSZ1ww

提取码:zl01

代码,我用的是laravel框架,页面:index.blade.php

<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>美团外卖优惠券-饿了么外卖优惠券-点击关注公众号[ i外卖优惠券 ]</title>

<meta name="keywords" content="美团外卖优惠券-饿了么外卖优惠券-点击关注公众号[ i外卖优惠券 ]">

<meta name="description" content="一键领取美团/饿了么外卖红包的网站,一键领取饿了么无门槛通用红包、品质联盟红包等各种外卖红包!">

<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">

<link rel="stylesheet" href="{{ url('frontResource/style/main.css') }}">

</head>

<body>

<header id="header">

<div class="content">

<h1><a href="#three">外卖优惠券每天免费领</a></h1>

<p><a href="#three">按(Ctrl+D)收藏本网站,每天都可领取!</a></p>

<hr>

<p><a href="#three">美团外卖、饿了么2~66元红包免费领无门槛使用、通用优惠券、下午茶红包、夜宵红包、美食红包等你领!</a></p>

</div>

</header>

<section id="three" class="wrapper style2 special">

<header class="major">

<h2 "color:#FC0307; font-weight:bold;">领外卖通用优惠券,每天免费领</h2>

<h2>

<p>【点击下面链接直接领取】</p>

</h2>

</header>

<div>

<ul class="actions special">

<li><a href="https://mmbizurl.cn/s/JrnzHc3ly" class="button" rel="nofollow" target="_blank" "background:#fec22c;">美团外卖最高68元</a></li>

</ul>

</div>

<div>

<ul class="actions special">

<li><a href="https://tb.g2h3.com/59x6G" class="button" rel="nofollow" target="_blank" "background: #00b8fe">饿了么外卖优惠券</a></li>

</ul>

</div>

</section>引入微信分享的js,这个是必须要引入的。

<scriptsrc="https://res2.wx.qq.com/open/js/jweixin-1.2.0.js"></script>

分享的代码,该注意的是:nonceStr,signature,appId ,link都要加上引号,不然会报错。

<script>

wx.config({

debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。

appId: '<?php echo $data["appId"];?>', // 必填,公众号的唯一标识

timestamp:<?php echo $data["timestamp"];?>, // 必填,生成签名的时间戳

nonceStr:'<?php echo $data["nonceStr"];?>', // 必填,生成签名的随机串

signature:'<?php echo $data["signature"];?>',// 必填,签名

jsApiList: [

'checkJsApi',

'onMenuShareTimeline',

'onMenuShareAppMessage',

'onMenuShareQQ',

'onMenuShareWeibo',

'onMenuShareQZone'

]

});

wx.ready(function(){

// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,

// 所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。

// 对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。

});

wx.error(function(res){

// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,

// 也可以在返回的res参数中查看,对于SPA可以在这里更新签名。

});

</script>

<script>

wx.ready(function() {

wx.onMenuShareTimeline(data);

wx.onMenuShareAppMessage(data);

});

//

var data={

title: '外卖优惠券免费领取', // 分享标题

desc: '美团外卖、饿了么2~66元红包,每天可免费领取无门槛使用、通用优惠券', // 分享描述

link: '<?php echo $data["url"];?>', // 分享链接

imgUrl: 'http://hd.xxx.com/frontResource/images/20210111.png', // 分享图标

success: function() {

// 用户确认分享后执行的回调函数

alert("分享成功");

},

cancel: function() {

// 用户取消分享后执行的回调函数

alert("分享失败");

}

};

</script>前端页面代码就那样,很简单。

后端传值渲染过来的,也是前端必要的数据就这么几个,都在上面js里。这里用的是laravel。路由用get。

Route::get('front/outfood',['as'=>'front.outfood.index','uses'=>'OutFoodController@index']);

Controller用到的是weixin仓储的依赖注入,主要返回的方法:getSignPackage

class OutFoodController extends Controller

{

private $wechatAuthRepository;

public function __construct(WechatAuthRepository $wechatAuthRepos)

{

$this->wechatAuthRepository = $wechatAuthRepos;

}

public function index()

{

$data = $this->wechatAuthRepository->getSignPackage();

return view('front.outfood.index',compact('data'));

}

}

getSignPackage()方法里主要就是$jsapiTicket 获取签名,$nonceStr是随机16位字符串的方法。返回来的$signPackage 就是前端页面所需要的数据

public function getSignPackage() {

$weixin_config = WeiXinConfig::where('id', 1)->first(['appid']);

$jsapiTicket = $this->getJsApiTicket();

$url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

$timestamp = time();

$nonceStr = $this->getNonceStr(16);

// 这里参数的顺序要按照 key 值 ASCII 码升序排序

$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";

$signature = sha1($string);

$signPackage = array(

"appId" => $weixin_config['appid'],

"nonceStr" => $nonceStr,

"timestamp" => $timestamp,

"url" => $url,

"signature" => $signature,

"rawString" => $string

);

return $signPackage;

}获取签名$jsapiTicket的方法,ticket在7200s就会过期,我们可以使过期时间加长,我这里处理后放在cache里。

private function getJsApiTicket() {

// jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例

$data = Cache::get('jsapi_ticket');

if(!$data){

$res = $this->jsApiTicket();

$ticket = $res['jsapi_ticket'];

}else{

if($data['expire_time'] < time()){

$res = $this->jsApiTicket();

$ticket = $res['jsapi_ticket'];

}else{

$ticket = $data['jsapi_ticket'];

}

}

return $ticket;

}

public function jsApiTicket()

{

$data = [];

$accessToken = $this->get_access_token();

$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";

$res = $this->curlGetDate($url);

$ticket = $res->ticket;

if ($ticket) {

$data['expire_time'] = time() + 7000;

$data['jsapi_ticket'] = $ticket;

Cache::put('jsapi_ticket',$data);

}

return $data;

}获取ticket,就要获取到access_token,这里access_token的过期时间也是7200s,我们也可以拉长点。防止时间差

//获取普通access_token的统一方法,用于各种接口

public function get_access_token(){

$weixinConfig = WeiXinConfig::where('id', 1)->first();

$now = time();

if ($now < strtotime($weixinConfig->expired_at)) {

return $weixinConfig->access_token;

}

$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $weixinConfig->appid . '&secret=' . $weixinConfig->secret;

$json = http_request_json_weixin($url);

$data = json_decode($json, true);

if(is_array($data) && isset($data['access_token'])){

$weixinConfig->access_token = $data['access_token'];

$weixinConfig->expired_at = $now + 7000;// 原token有效期为7200秒 先手动设置为7000秒 防止时间差

$weixinConfig->save();

return $weixinConfig->access_token;

}

throw new Exception('获取access_token失败 res:' . $json, -110);

}还有一些必要的方法

获取随机字符串方法,如下:

/**

*

* 产生随机字符串

* @param int $length

* @return string

*/

public function getNonceStr($length = 32)

{

$chars = 'abcdefghijklmnopqrstuvwxyz0123456789';

$str = '';

$char_len = strlen($chars);

while($length-- > 0){

$rand = mt_rand(0, $char_len - 1);

$str .= $chars{$rand};

}

return $str;

}curlGetDate 方法,如下:

//curl get请求

public function curlGetDate( $url )

{

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_HEADER, 0);

$output = curl_exec($ch);

curl_close($ch);

return json_decode($output);

}http_request_json_weixin 方法

//curl模拟请求

function http_request_json_weixin($url, $data=null){

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,$url);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

if(!empty($data)){

curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

}

$result = curl_exec($ch);

curl_close($ch);

return $result;

}获取appid的方法的话,你可以直接写死在页面,也可以方法配置文件里,或者统一数据表里。

具体代码都在了,就差你也实现一下了。你也不要被框架给束缚了,其实都是一样的。分享在群里的效果如下

以上是本文的全部内容,希望对你的学习有帮助,也感谢你对PHP自学中心的支持

原文地址:https://www.toutiao.com/article/6916899946633413124/

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读8.4k次,点赞8次,收藏7次。SourceCodester Online Tours & Travels Management System pay.php sql injectionLine 16 of pay.php invokes a SQL query built using unvalidated input. This call could allow an attacker to modify the statement’s meaning or to execute arbitrary SQL commands.SQL
文章浏览阅读3.4k次,点赞46次,收藏51次。本文为大家介绍在windwos系统搭建typecho博客+cpolar内网穿透工具将博客发布到公共网络环境,实现远程也可以访问和操作。_windows搭建typecho
文章浏览阅读1.1k次。- php是最优秀, 最原生的模板语言, 替代语法,让php更加的优雅的与html生活在一起 -->请放心, 最终生成的,或者说用户最终看到的,仍然是一个html文档, php代码中的内容不会被泄漏的。-- 将php与html代码混编的时候,大括号很容易造成配对错误,最好杜绝它 -->php标签内部代码由php.exe解释, php标签之外的代码原样输出,仍由web服务器解析。-- 所以php的流程控制语句, 都提供了替代语法,用冒号代替大括号 -->php echo '百变鹏仔'?_利用php将静态页面修改为动态页面
文章浏览阅读1.1k次,点赞18次,收藏15次。整理K8s网络相关笔记博文内容涉及 Linux network namespace 认知以及彼此通信Demo,实际中的应用理解不足小伙伴帮忙指正不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树。_linux network namespace 多端通信 模式认知
文章浏览阅读1.2k次,点赞22次,收藏19次。此网络模型提供了一个逻辑二层(L2)网络,该网络封装在跨 Kubernetes 集群节点的现有三层(L3)网络拓扑上。使用此模型,可以为容器提供一个隔离的 L2 网络,而无需分发路由。封装网络带来了少量的处理开销以及由于覆盖封装生成 IP header 造成的 IP 包大小增加。封装信息由 Kubernetes worker 之间的 UDP 端口分发,交换如何访问 MAC 地址的网络控制平面信息。此类网络模型中常用的封装是 VXLAN、Internet 协议安全性 (IPSec) 和 IP-in-IP。_k8s网络组件对比
文章浏览阅读1.1k次,点赞14次,收藏19次。当我们谈论网络安全时,我们正在讨论的是保护我们的在线空间,这是我们所有人的共享责任。网络安全涉及保护我们的信息,防止被未经授权的人访问、披露、破坏或修改。
文章浏览阅读1.3w次,点赞3次,收藏7次。尽管您可以通过 ping 命令解析出网站的 IP 地址,但是可能在浏览器中访问时仍然遇到问题,这可能是因为浏览器使用的 DNS 解析结果不同于 ping 命令使用的解析结果。可能是因为您的网络或设备上设置了防火墙,阻止了对特定网站的访问。有些国家或组织可能会对特定的域名进行屏蔽,从而阻止访问相关网站。如果您的网络使用代理服务器进行访问控制,可能会由于代理服务器的配置问题导致无法访问某些网站。即使您的网络和设备一切正常,目标网站本身可能也存在问题,例如服务器故障、维护或过载,导致无法访问。_能ping通打不开网页
文章浏览阅读839次,点赞22次,收藏19次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。
文章浏览阅读2.1k次,点赞31次,收藏22次。基于微信小程序奶茶点餐外卖系统设计与实现(PHP后台+Mysql)可行性分析毕设源代码毕业设计,数据安全和系统稳定性以及团队能力和资源配备方面都具备较好的条件。因此,该项目的可行性较高。:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;微信小程序作为一种快捷、方便的移动应用形式,成为很多用户点餐外卖的首选。项目的界面和功能都可以定制,包安装运行!项目配有对应开发文档、开题报告、任务书、PPT、论文模版等。
文章浏览阅读1.8k次,点赞52次,收藏38次。本文主要通过对系统的前台系统和后台管理系统进行了功能性需求分析,对系统的安全性和可扩展性进行了非功能性需求分析。在详细的需求分析的基础上,根据系统的功能设计确定了数据库结构,实现完整的代码编写。Lucky+Baby母婴用品网站使用 Dreamweaver、HBuilder代码编辑器、Apache服务器等开发工具,完成了系统的主要模块的页面设计和功能实现。本文展示了首页页面的实现效果图,并通过代码和页面介绍了用户注册功能、商品搜索功能、生成订单和查看我的订单功能、在线付款功能功能的实现过程。
文章浏览阅读1.5k次,点赞45次,收藏40次。本设计主要实现集人性化、高效率、便捷等优点于一身的人事信息管理系统,完成首页、系统用户、通知公告、部门信息、员工薪资、考勤签到、员工请假、招聘信息、应聘信息等功能模块。
文章浏览阅读1k次。该错误通常出现在数据库读取结果集数据时,比如当我们写好SQL语句从数据库读取数据时,本身应该返回结果集,再给结果集中读取数据。解决思路:这种错误一般是因为echo后面输出了一个数组导致的,或者是数组作为字符串进行拼接运算时导致的。该错误直译为:警告:mysqli_fetch_assoc函数期望参数1是mysqli的结果集,但是给了一个布尔值。这种错误是PHP解析器在解析时遇到了语法错误,直译为:解析错误:语法错误,意料之外的...该错误直译为:提示:未定义的索引:username。_array to string conversion in
文章浏览阅读2.7w次。解决http请求报错context deadline exceeded (Client.Timeout exceeded while awaiting headers)_context deadline exceeded (client.timeout exceeded while awaiting headers)
文章浏览阅读1.3k次,点赞26次,收藏24次。复杂网络是一种由大量相互连接的元素(节点或顶点)组成的网络结构,这些连接通常是非常复杂和动态的。这些网络可以在各种领域中发现,包括社交网络、生物学系统、信息技术和交通系统等。_代理建模
文章浏览阅读2.6k次,点赞76次,收藏71次。epoll详解,事件模型,ET/LT模式,并通过三个示例进行代码实现。
文章浏览阅读3.3k次。罗拉ROLA-IP是一家来自纽约的代理IP提供商,由李嘉诚先生投资建设,韩国人工智能、自动驾驶、虚拟现实方面的领军企业World IT Show投资入股,由美国纽约大学IT管理教授团队研究开发,进入中国市场6年多,全世界设有多个分子公司。接下来,我们要检查代理和防火墙的设置,因为在绝大多数情况下,它们是导致这个错误的原因,尤其是当用户使用免费代理时。对网站的访问受阻实际上是一个非常常见的错误,它既可能是由于物理原因(硬件问题)造成的,也可能是由于软件错误引起的。检查代理设置,并确保其正确配置。_无法访问此网站,检查代理服务器和防火墙
文章浏览阅读1.1k次,点赞14次,收藏20次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。_php洗车服务预约管理系统php源码
文章浏览阅读1.1k次。桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。
文章浏览阅读936次,点赞22次,收藏17次。本系统带文档lw万字以上文末可领取本课题的JAVA源码参考。
文章浏览阅读822次,点赞15次,收藏14次。在整个设计过程中,要确定可能的具体解决方案,以实现每一个小的最终目标,对于每一个小目标,我们首先必须了解一些相关的需求分析信息。除了以上作品下面是2023-2024年最新100套计算机专业原创的毕业设计源码+数据库,是近期作品,如果你的题目刚好在下面可以文末领取java源码参考。springboot基于springboot的在线考试系统。springboot基于springboot的商城购物系统。springboot基于微信小程序的智慧校园设计与实现。springboot基于用户的协同过滤算法的话题推荐。