android 调用js怎么获取返回值_ThinkPHP5集成JS-SDK实现微信自定义分享功能

最近开发一个项目,需要将链接分享给好友时能够自定义标题、简介和logo,现将ThinkPHP5集成JS-SDK实现微信自定义分享功能的过程整理成文。

一、准备工作

1、认证的公众号

不管是订阅号还是服务号,都需要是经过认证的,否者不支持微信分享功能。

5b601d4caa02655dbcfbd1542f4cf528.png

2、绑定域名

登录微信公众平台,设置—公众号设置—功能设置里,填写『JS接口安全域名』。

填写的域名须通过ICP备案的验证,并将平台给的txt文件放到域名指向的web服务器之下。

2ca99fd5cb3652ae3f66b707bc729660.png

3、获取开发者ID和开发者密码

登录微信公众平台,开发—基本配置,即可看到AppID和AppSecret(若没有需要开启)。

4、下载官方示例代码

可在http://demo.open.weixin.qq.com/jssdk/sample.zip下载包含php、java、nodejs以及python的示例代码,其中php文件夹包含如下文件:

b7387e0493a98951ac51f8421c66a2c5.png

二、正式开发

1、PHP部分

1)将下载的php示例代码中的access_token.php、jsapi_ticket.php和jssdk.php放入到tp5框架的第三方接口扩展目录下,路径为extend/org/wechat/文件。

f1ed208d3b01bfe4c4a08d8b606c2cc3.png

2)将jssdk.php文件重命名为Jssdk.php文件,设置命名空间,因为tp路由的关系,需要加上私有属性path,并在构造函数中设置 $this->path = __DIR__ . DS;

dc1260c8b94616754e917fc75b5225ca.png

同时将get_php_file函数返回值中的$filename改为 $this->path . $filename ,否则会报错。

5970c8d6da1655f78e5171be686ca332.png

3)在config.php文件中,将先前获得的AppID和AppSecret配置好。

4)在application/index/controller下新建Wechat.php文件,内容如下:

e0bb2cc1d26fb2f9853d68b288e7e965.png

2、JS部分

1)引入JS文件

在需要调用JS接口的页面引入JS文件(支持https):

<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
2)调用JS接口
官方技术文档给了如下说明:

// 通过config接口注入权限验证配置
wx.config({
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: '',   // 必填,公众号的唯一标识
    timestamp: , // 必填,生成签名的时间戳
    nonceStr: '', // 必填,生成签名的随机串
    signature: '',// 必填,签名
    jsApiList: [] // 必填,需要使用的JS接口列表
});
// 通过ready接口处理成功验证
wx.ready(function(){
    // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。
    // 对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});

代码如下:

9f2fc33d915f8e7ece64afab944eb225.png

至此就完成微信分享功能的开发了。

三、问题及解决方法

在开发过程中先后遇到了两次invalid signature签名错误,一次是分享首页成功,但是分享二级页面失败;一次是分享过的页面再次分享时会失败。

官方技术文档给了如下说明:

确保你获取用来签名的url是动态获取的。
如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去'#'hash部分的链接(可用location.href.split('#')[0]获取,而且需要encodeURIComponent),
因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。
第一个问题是因为首页由控制器输出模板,对模板进行赋值。控制器生成的签名和首页一致,与二级页面却不一致,所以我采取ajax方法,将静态页面的url传给后台(PHP),这样生成的签名就一致了。

1)首先是改写Jssdk.php中的签名算法,因为生成签名的方法为:

public function getSignPackage() {
    $jsapiTicket = $this->getJsApiTicket();
 
    // 注意 URL 一定要动态获取,不能 hardcode.
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://"; : "http://";;
    $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    $timestamp = time();
    $nonceStr = $this->createNonceStr();
 
    // 这里参数的顺序要按照 key 值 ASCII 码升序排序
    $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
 
    $signature = sha1($string);
 
    $signPackage = array(
        "appId"     => $this->appId,
        "nonceStr"  => $nonceStr,
        "timestamp" => $timestamp,
        "url"       => $url,
        "signature" => $signature,
        "rawString" => $string
    );
    return $signPackage;
}

其中, $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url”; 这里的url要改成静态页面的url。
所以在Jssdk.php文件中增加私有属性url,并在构造函数中设置 $this->url = $url;

f7e3810e54f8e421a8e5ebd904daa5a8.png

2)控制器中不再采用给模板赋值的方式,而是使用json_encode()函数中将签名返回给静态页面。

cfb4f142d9e8a0e748b5e26f2528570e.png

3)静态页面中用ajax获取wx.config配置所需的几个参数的值,可以这样做:

<script type="text/javascript">
    url = location.href.split('#')[0]; // 传给后台PHP
    $.ajax({
        type: "GET",
        url: "https://xxx.com/wechat/share?url="+url,
        dataType : "json",
        success: function(data) {
            // 先前分享部分的代码挪到这里来
        }
    });
</script>

在需要分享的静态页面中引入这段JS代码,即可成功分享所有页面。第一个问题就解决了~

第二个问题更简单,官方技术文档已经说得很清楚了,js获取当前页面的链接可用location.href.split('#')[0]获取,而且需要encodeURIComponent,因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数。

果然,因为我没encodeURIComponent,所以再次分享时链接为https://xxx.com/index.html?from=singlemessage&isappinstalled=0

bf546470737d299d252613e901306707.png

url中红色部分内容是微信自动为分享链接添加的参数,目的是为了记录分享来源。

from=singlemessage&isappinstalled=0表示来自好友分享 from=timeline&isappinstalled=0表示来自朋友圈分享 from=groupmessage&isappinstalled=0表示来自微信群分享

只要在上述JS代码中加上encodeURIComponent这句代码即可。如下所示:

url = location.href.split('#')[0]; url = encodeURIComponent(url);


That’s all~

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要

PHP进阶架构师>>>视频、面试文档免费获取​docs.qq.com
abfb16a18b9f4d2d1afa94d0ed282421.png

或者关注咱们下面的专栏

PHP架构师之路​zhuanlan.zhihu.com
6fb38f6cdb3e9b86c7aa6f5b4a785544.png
作者:呦呦鹿鸣
来源:https://www.cnblogs.com/sunshineliulu/p/8034286.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JS API 接口接收与返回 是一个轻型的、安全的、跨网际的、跨语言的、跨平台的、跨环境的、跨域的、支持复杂对象传输的、支持引用参数传递的、支持内容输出重定向的、支持分级错误处理的、支持会话的、面向服务的高性能远程过程调用协议。 该版本直接解压后就可以使用,其中 属于公共文件。不论是客户端还是服务器端都需要这些文件。 是客户端文件,如果你只需要使用客户端,那么只要有上面那些公共文件和这个文件就可以使用了,使用时,直接在你的程序中包含 phprpc_client.php 就可以,公共文件不需要单独包含。 这三个文件是服务器端需要的文件。 其中 dhparams 目录中包含的是加密传输时用来生成密钥的参数 dhparams.php 是用来读取 dhparams 目录中文件的类。 phprpc_server.php 是服务器端,如果你要使用 PHP 来发布 PHPRPC 服务,只需要包含这个文件就可以了。公共文件和 dhparams.php 都不需要单独包含。 PHP 4.3+、PHP 5、PHP 6 客户端要求开启 socket 扩展。 服务器端需要有 IIS、Apache、lighttpd 等可以运行 PHP 程序的 Web 服务器。 如果服务器端需要加密传输的能力,必须要保证 session 配置正确。 <?php include('php/phprpc_server.php'); //加载文件 function hello($name) { return'Hello ' . $name; } $server = new PHPRPC_Server(); //创建服务端 $server->add(array('hello', 'md5', 'sha1')); //数组形式一次注册多个函数 $server->add('trim'); //单一注册 $server->start(); //开启服务 ?> <?php include ("php/phprpc_client.php"); //加载文件 $client = new PHPRPC_Client('http://127.0.0.1/server.php'); //创建客户端 并连接服务端文件 echo$client->Hello("word"); //调用方法 返回 hello word ?> -------------------------------------------------- --------------------------------------------------- ------------------------------ 服务端其他说明: <?php include('php/phprpc_server.php'); //加载文件 function hello($name) { return'Hello ' . $name; } class Example1 { staticfunction foo() { return'foo'; } function bar() { return'bar'; } } $server = new PHPRPC_Server(); //创建服务端 $server->add('foo', 'Example1'); //静态方法直接调用 $server->add('bar', new Example1()); //非静态方法 需要实例化 //注册别名调用 $server->add('hello', NULL, 'hi'); //第三参数是函数的别名 客户端通过别名来调用函数 $server->add('foo', 'Example1', 'ex1_foo'); $server->add('bar', new Example1(), 'ex1_bar'); $server->setCharset('UTF-8'); //设置编码 $server->setDebugMode(true); //打印错误 $server->setEnableGZIP(true); //启动压缩输出虽然可以让传输的数据量减少,但是它会占用更多的内存和 CPU,因此它默认是关闭的。 $server->start(); //开启服务 ?> -------------------------------------------------- --------------------------------------------------- --------------------------- 客户端其他说明: <?php include ("php/phprpc_client.php"); $client = new PHPRPC_Client(); $client->useService('http://127.0.0.1/server.php'); //远程调用地址 $client->setKeyLength(1000); //密钥长度 $client->setEncryptMode(3); //加密等级0-3 $client->setCharset('UTF-8'); //设置编码 $client->setTimeout(10); //设置超时时间 echo$client->hi('PHPRPC'), "\r\n"; //调用函数 echo$client->getKeyLength(), "\r\n"; //下面是返回 echo$client->getEncryptMode(), "\r\n"; echo$client->getCharset(), "\r\n"; echo$client->getTimeout(), "\r\n"; ?> -------------------------------------------------- --------------------------------------------------- ---------------------- 关于session <?php include('php/phprpc_server.php'); class ExampleCounter { function ExampleCounter() { if (!isset($_SESSION['count'])) { $_SESSION['count'] = 0; } } function inc() { $_SESSION['count'] += 1; } functioncount() { return$_SESSION['count']; } } $server = new PHPRPC_Server(); $server->add(array('inc', 'count'), new ExampleCounter()); $server->start(); ?> <?php include("php/phprpc_client.php"); $client = newPHPRPC_Client(); $client->useService('http://127.0.0.1/1.php'); $client->setTimeout(10); echo $client->inc(); echo $client->count(); echo $client->inc(); echo $client->count(); ?> 每次刷新都是新建的client 服务端并不能识别.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值