laravel_微信分享_Mr-任的博客-程序员宅基地_laravel 微信分享

技术标签: 技术  个人感悟  

今天接触到了微信分享,来记录一下自己所理解的一些逻辑,首先,我画了一个草图,模拟逻辑.

 

微信官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115

 

上代码:

test.blade.php


 
  
  1. <!DOCTYPE html>
  2. <html lang= "en">
  3. <head>
  4. <meta charset= "UTF-8">
  5. <title>微信分享测试</title>
  6. </head>
  7. <body onload= "window_onload()">
  8. <div style= "width:100%;"><img style= "width:100%" src= "#" alt= ""></div>
  9. </body>
  10. <script src= "http://www.jq22.com/jquery/jquery-2.1.1.js"></script>
  11. <script type= "text/javascript" src= "http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
  12. <script>
  13. function window_onload() {
  14. $.ajax({
  15. type: "GET",
  16. url: "/test/getConfig",
  17. data: {url: this.location.href},
  18. dataType: "json",
  19. success: function (data) {
  20. wx.config({
  21. debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  22. appId: data.appid, // 必填,公众号的唯一标识
  23. timestamp: data.timestamp, // 必填,生成签名的时间戳
  24. nonceStr: data.nonceStr, // 必填,生成签名的随机串
  25. signature: data.signature, // 必填,签名,见附录1
  26. jsApiList: [ 'checkJsApi',
  27. 'onMenuShareTimeline',
  28. 'onMenuShareAppMessage',
  29. 'onMenuShareQQ',
  30. 'onMenuShareWeibo',
  31. 'hideMenuItems',
  32. 'showMenuItems',
  33. 'hideAllNonBaseMenuItem',
  34. 'showAllNonBaseMenuItem',
  35. 'translateVoice',
  36. 'startRecord',
  37. 'stopRecord',
  38. 'onRecordEnd',
  39. 'playVoice',
  40. 'pauseVoice',
  41. 'stopVoice',
  42. 'uploadVoice',
  43. 'downloadVoice',
  44. 'chooseImage',
  45. 'previewImage',
  46. 'uploadImage',
  47. 'downloadImage',
  48. 'getNetworkType',
  49. 'openLocation',
  50. 'getLocation',
  51. 'hideOptionMenu',
  52. 'showOptionMenu',
  53. 'closeWindow',
  54. 'scanQRCode',
  55. 'chooseWXPay',
  56. 'openProductSpecificView',
  57. 'addCard',
  58. 'chooseCard',
  59. 'openCard'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
  60. });
  61. wx.ready( function () {
  62. wx.onMenuShareAppMessage({
  63. title: '分享标题', // 分享标题
  64. desc: '分享描述', // 分享描述
  65. link: '#', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
  66. imgUrl: '#', // 分享图标
  67. type: 'link', // 分享类型,music、video或link,不填默认为link
  68. dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
  69. success: function () {
  70. alert( '分享成功')
  71. }
  72. });
  73. });
  74. wx.error( function (res) {
  75. alert( "error: " + res.errMsg);
  76. });
  77. },
  78. error: function () {
  79. alert(error);
  80. }
  81. })
  82. }
  83. </script>
  84. </html>

TestWeixinController.php


 
  
  1. <?php
  2. namespace App\ Http\ Controllers;
  3. use Illuminate\ Support\ Facades\ Cache;
  4. use Illuminate\ Http\ Request;
  5. use App\ Http\ Requests;
  6. use App\ Http\ Controllers\ Controller;
  7. use Illuminate\ Support\ Facades\ Input;
  8. class testWeixinController extends Controller
  9. {
  10. public function getConfig(Request $request)
  11. {
  12. //获取参数
  13. $url = $request->get( 'url');
  14. //公众号的appid、secret
  15. $appid = "appid";
  16. $secret = "secret";
  17. //缓存内是否存在accessToken。
  18. $accessToken = Cache::remember( 'accessToken11', 120, function () use ($appid, $secret) {
  19. //获取access_token的请求地址
  20. $accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appid&secret=$secret";
  21. //请求地址获取access_token
  22. $accessTokenJson = file_get_contents($accessTokenUrl);
  23. $accessTokenObj = json_decode($accessTokenJson);
  24. $accessToken = $accessTokenObj->access_token;
  25. return $accessToken;
  26. });
  27. //获取jsapi_ticket的请求地址
  28. $ticketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=$accessToken&type=jsapi";
  29. $jsapiTicketJson = file_get_contents($ticketUrl);
  30. $jsapiTicketObj = json_decode($jsapiTicketJson);
  31. $jsapiTicket = $jsapiTicketObj->ticket;
  32. //随机生成16位字符
  33. $noncestr = str_random( 16);
  34. //时间戳
  35. $time = time();
  36. //拼接string1
  37. $jsapiTicketNew = "jsapi_ticket=$jsapiTicket&noncestr=$noncestr×tamp=$time&url=$url";
  38. //对string1作sha1加密
  39. $signature = sha1($jsapiTicketNew);
  40. //存入数据
  41. $data = [
  42. 'appid' => $appid,
  43. 'timestamp' => $time,
  44. 'nonceStr' => $noncestr,
  45. 'signature' => $signature,
  46. 'jsapiTicket' => $jsapiTicket,
  47. 'url' => $url,
  48. 'jsApiList' => [
  49. 'api' => '#'
  50. ]
  51. ];
  52. //返回
  53. return json_encode($data);
  54. }
  55. }

2018-09-20 添加说明: $jsapiTicket 最好也需要存入session   

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/RJ12345678/article/details/82840932

智能推荐

object-c中的类目,延展,协议_weixin_30885111的博客-程序员宅基地

协议协议只有方法的声明(类似于其他编程语言的接口)协议相当于大家都所遵循的关键字 @protocol 协议名 &lt;所遵循的协议&gt; 默认[email protected]@protocollamcoProtocol &lt;NSObject&gt;@required//必须实现的方法-(void)study;@opti...

Java学习笔记(八)——多线程_木子丨北执的博客-程序员宅基地

创建线程的第一种方式:继承Thread类步骤:①定义类继承Thread②复写Thread类中的run方法,目的:将自定义代码存储在run方法中,让线程运行③调用线程的start方法,该方法两个作用:启动线程,调用run方法Thread为什么要覆盖run方法呢?Thread类用于描述线程,该类就定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法,也就是说Thread类中的run方法,用于存储线程要运行的代码。代码示例class Test_thread extends

职场十个寓言故事_yy_阳阳的博客-程序员宅基地

<br />(一)<br /><br />  一只乌鸦坐在树上,整天无所事事。一只小兔子看见乌鸦,就问:“我能象你一样整天坐在那里,什么事也不干吗?”乌鸦答道:“当然啦,为什么不呢?”于是,兔子便坐在树下,开始休息。突然,一只狐狸出现了。狐狸跳向兔子……并把它给吃了。<br /><br />  这个故事的寓意是……要想坐在那里什么也不干,你必须坐(做)得非常非常高。<br /><br /><br /><br />(二)<br /><br />  一只火鸡和一头公牛在聊天。“我非常

git pull设置忽略文件以及文件夹_小兜全糖(Cx)的博客-程序员宅基地_git pull 忽略文件

xxx:指文件名git update-index --assume-unchanged xxx //pull时候忽略xxx这个文件git update-index --no-assume-unchanged xxx //pull时候取消忽略xxx这个文件//忽略Output 这个文件夹,注意后面带着 / 斜杠git update-index --assume-unchanged Output /...

图灵程序设计丛书(SQL必知必会)笔记_weixin_30815427的博客-程序员宅基地

SQL必知必会第二课:检索数据  1、分页    (1)、SQL Server 栗子 : select top 2 columns from tableName    (2)、Oracle 栗子 :select * from tableName ROWNUM &lt;= 5    (3)、Mysql 栗子:selct * from tableName limit 5    ...

串的应用举例_为爱坚持的博客-程序员宅基地_串的应用

假设串S1 = "I come from Beijing",S2 = "Chongqing" ,Sub = "America". 利用串的基本操作,如果串的赋值、串的插入、串的删除、串的替换、对上面 的串进行操作#include #include #define MAXSIZE 60 typedef struct { char str[MAXSIZE]

随便推点

Go 语言,开源服务端代码自动生成 框架 - EasyGoServer_chongchangcheng5929的博客-程序员宅基地

EasyGoServer作者:林冠宏 / 指尖下的幽灵掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8博客:http://www.cnblogs.com/linguanh/GitHub : https://github....

用CSS3制作照片墙_只想安静的敲代码的博客-程序员宅基地_css3做照片墙

1.相关知识点:Chrome 和 Safari 需要前缀 -webkit-;Internet Explorer 9 需要前缀 -ms-:Firefox需要前缀-moz-box-shadow:        功能:给元素的边框添加阴影效果        语法:box-shadow:x轴偏移量  y轴偏移量 阴影模糊半径 阴影扩展半径 阴影颜色 投影方式transform:        功能:使元素...

Okio读写流源码详解(第四篇(GzipSink压缩源码详解))_飞雨的夏天的博客-程序员宅基地

首先还是先找到程序的入口点,先看看GzipSink这个类怎么用吧private static void zipDecompression() { String filePath = "D:/1.txt"; try { Source source = Okio.source(new File(filePath)); GzipSource responseBod

Selenium 、WebDriver :Capability_weixin_33979745的博客-程序员宅基地

Selenium | WebDriver Capability内容摘要:1、WebDriver 通用配置2、RemoteWebDriver特有配置3、Grid特有配置4、在使用特定浏览器时的配置4.1 Chrome 4.2 Firefox4.3 IE4.4 LoggingPerfs4.5 WebDriver Proxy Config ...

数据采集:如何使用物联网边缘计算网关采集数据?_罗米网关的博客-程序员宅基地_边缘采集网关

数据采集网关,支持Modbus/RTU、国标DLT645-1997、DLT645-2007、CJ/T188-2004以及各类自定义协议,多通道并行采集仪表数据。主要用作数据采集,不断丰富、完善采集驱动(包括仪表类、PLC、空调、数控机床、机器人等)。网关提供Modbus,OPC UA服务接口,为传统的工控系统,SCADA系统提供数据服务。网关可以提供Mqtt,http,Sorket等it类接口,为物联网平台提供数据服务。网关提供Http实时数据服务接口。网关建立了仪表跟服务端应用软件的数据通道

Informatica Update机制详解_红笺短的博客-程序员宅基地

转自:http://informatica.iblog.com/post/3070/381606Informatica 作为ETL工具,Update是其很重要的一个特性。也正因为如此,我们会发现在Informatica工具的很多地方都会有Update的相关设置,许多时候给大家都造成了很大的迷惑,不知道谁先谁后,谁的优先级高,或者具体的作用是什么,希望能借此文给大家一个清晰的概念。

推荐文章

热门文章

相关标签