易信公众平台demo代码php(含验证接口)

合集下载

PHP实现微信公众号验证Token的示例代码

PHP实现微信公众号验证Token的示例代码

PHP实现微信公众号验证Token的⽰例代码难度⽔平:初中级适⽤⼈群:对微信公众号开发有认知跟实践的童鞋阅读时间:8分钟缘起很久之前做过⼀次公众号的开发,当时就遇到了⼀个验证的⼩坑,但是由于时间紧任务急处理完了也就没在意,可谁知最近刚刚上马⼀个新的公众号项⽬⼜遇到了同样的⼩坑,痛定思痛决定奋笔疾书留下痕迹,省的以后再次忘记了。

开始验证⾸先来⼀张胜过千⾔万语的图,说明我们要验证的⽬标:然后开始扫坑。

先扫个盲,微信验证的⽬的就是你来证明你的服务器地址的有效性,所以带着这个⽬的我们来看看下⾯这些问题:URL地址怎么写纯PHP的代码怎么写Laravel的代码怎么写常见的坑是什么URL地址怎么写这个地址可以是路由地址也可以是⽂件地址:敲⿊板,划重点:⽆论哪种形式都可以,重点是可以直接通过GET或者POST访问到纯PHP的代码怎么写通常来说纯代码就是⾮框架的php代码验证⽅式,废话少说,直接上酸菜:/*这个是你⾃定义的令牌,图⽚⾥⾯Token的位置*/define("TOKEN", "这个是你⾃定义的令牌");/*初始化当前的类*/$wechatObj = new wechatCallbackapiTest();/*开始验证程序*/$wechatObj->valid();/*** Class WXApiVerify*/class WXApiVerify{/*** 检测函数输出*/public function valid(){$echoStr = $_GET['echostr'];if($this->checkSignature()){echo $echoStr; #坑点,看下⾯的常见坑介绍exit; #⼀定要停⽌php运⾏,避免产⽣不必要的字串符}}/*** 前⾯检测* @return bool*/private function checkSignature(){#注意:这⾥可以不⽤检验$_GET参数的有效性,因为微信⼀定会传相关的参数给你的服务器的,你直接开启验证模式即可。

易信公众平台开始公测 公众账号可对关注用户进行审核

易信公众平台开始公测 公众账号可对关注用户进行审核

易信公众平台开始公测公众账号可对关
注用户进行审核
A5站长网(/)9月6日消息,今日网易与电信联合开发的移动即时通讯软件易信正式推出公
易信公众平台主要有四大内容模块:客服服务、工具助手、内部分享、媒体资讯。

易信表示将户提供更加丰富的实用工具。

提供关注验证权限,更好的向企业组织提供内部分享交流服务。

品牌
从易信公众平台的介绍来看,其与微信公众平台最大的区别和特色是内容分享功能,即关注验证号,只存在单一的用户对账号的审核,关注哪些账号由用户决定。

而易信公众平台的关注验证权
易信公众平台注册,除需要提供个人身份证、真实照片、手机、电话等信息验证外,若属于企业、
易信8月19号推出以后,短短24小时内,用户数量突破100万大关,让网易再次成为互联网
出,将进一步完善易信的交流分享机智,对于微信来说,将带来何种程度的竞争,还需要时间来验文章来源于:/article-19274-1.html。

php版微信公众平台之微信网页登陆授权示例

php版微信公众平台之微信网页登陆授权示例

php版微信公众平台之微信⽹页登陆授权⽰例本⽂实例讲述了php版微信公众平台之微信⽹页登陆授权。

分享给⼤家供⼤家参考,具体如下:微信公众平台实现微信⽹页登陆授权开发其实是⾮常的简单了,因为官⽅的参考程序了,下⾯⼩编就看了⼀站长根据官⽅参考做的⼀个⽹页登陆授权例⼦,⼤家可看看.⽂件1:index.php//换成⾃⼰的接⼝信息$appid = 'XXXXX';header('location:https:///connect/oauth2/authorize?appid='.$appid.'&redirect_uri=127.0.0.1/oauth.php&response_type=code&scope=snsapi_userinfo&state=123&connect_redirect=1#wechat_redirect');参数是否必须说明appid是公众号的唯⼀标识redirect_uri是授权后重定向的回调链接地址,请使⽤urlencode对链接进⾏处理response_type是返回类型,请填写codescope是应⽤授权作⽤域,snsapi_base(不弹出授权页⾯,直接跳转,只能获取⽤户openid),snsapi_userinfo(弹出授权页⾯,可通过openid拿到昵称、性别、所在地。

并且,即使在未关注的情况下,只要⽤户授权,也能获取其信息)state否重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值#wechat_redirect是⽆论直接打开还是做页⾯302重定向时候,必须带此参数⽂件⼆:oauth.php,代码如下:<?php$code = $_GET['code'];$state = $_GET['state'];//换成⾃⼰的接⼝信息$appid = 'XXXXX';$appsecret = 'XXXXX';if (emptyempty($code)) $this->error('授权失败');$token_url = 'https:///sns/oauth2/access_token?appid='.$appid.'&secret='.$appsecret.'&code='.$code.'&grant_type=authorization_code';$token = json_decode(file_get_contents($token_url));if (isset($token->errcode)) {echo '<h1>错误:</h1>'.$token->errcode;echo '<br/><h2>错误信息:</h2>'.$token->errmsg;exit;}$access_token_url = 'https:///sns/oauth2/refresh_token?appid='.$appid.'&grant_type=refresh_token&refresh_token='.$token->refresh_token;//转成对象$access_token = json_decode(file_get_contents($access_token_url));if (isset($access_token->errcode)) {echo '<h1>错误:</h1>'.$access_token->errcode;echo '<br/><h2>错误信息:</h2>'.$access_token->errmsg;exit;}$user_info_url = 'https:///sns/userinfo?access_token='.$access_token->access_token.'&openid='.$access_token->openid.'&lang=zh_CN'; //开源软件: //转成对象$user_info = json_decode(file_get_contents($user_info_url));if (isset($user_info->errcode)) {echo '<h1>错误:</h1>'.$user_info->errcode;echo '<br/><h2>错误信息:</h2>'.$user_info->errmsg;exit;}//打印⽤户信息echo '<pre>';print_r($user_info);echo '</pre>';>参数描述openid⽤户的唯⼀标识nickname⽤户昵称sex⽤户的性别,值为1时是男性,值为2时是⼥性,值为0时是未知province⽤户个⼈资料填写的省份city普通⽤户个⼈资料填写的城市country国家,如中国为CNheadimgurl⽤户头像,最后⼀个数值代表正⽅形头像⼤⼩(有0、46、64、96、132数值可选,0代表640*640正⽅形头像),⽤户没有头像时该项为空.privilege⽤户特权信息,json数组,如微信沃卡⽤户为(chinaunicom)unionid只有在⽤户将公众号绑定到微信开放平台帐号后,才会出现该字段。

php手机短信验证代码(共9篇)

php手机短信验证代码(共9篇)

php手机短信验证代码(共9篇)篇一:短信验证码PHP代码篇二:用维泰SDK实现发送短信验证码php源码phprequire &quot;httprequest.php&quot;;/*&#39; 该示范程序通过:88/ 发送短信&#39;&#39;返回值:&#39;返回值大于0表示成功,小于0表示失败。

如果失败,返回信息还包括失败原因的文字描述。

&#39;说明:&#39;返回成功仅表示服务器已经成功接收客户提交的任务,并不表示对方已经收到短信。

&#39;因移动公司对短信内容审核严格,如测试未收到,请及时联系客服&#39;请不要发送&quot;测试&quot;,&quot;你好&quot;,&quot;abc&quot;等无意义的内容*/function smsend($strMobile,$strText){//发送短信的服务器地址$strServerURL = &quot;:88/cgi/sendsmsbatch.asp&quot;;// 短信账号:免费申请,如有问题请联系QQ732055019// :88/mis/user_reg_form.asp?interest=sms.api $strUser= &quot;username&quot;;// 验证密码: 初始密码由平台通过短信发送, 用户可登录平台自己修改$strPass= &quot;userpass&quot;;if($strUser==&quot;&quot;){echo (&quot;短信帐号没有设定!&quot;);return;}if($strPass==&quot;&quot;){echo (&quot;短信验证密码没有设定!&quot;);return;}if($strMobile==&quot;&quot;){echo (&quot;短信接收号码无效!&quot;);return;}if($strText==&quot;undefined|| $strText==&quot;&quot;){echo (&quot;短信内容不能为空!&quot;);return;}if(strlen($strText)69){echo (&quot;短信内容不能超过69个字&quot;);return;}//准备表单:使用urlencode对参数进行编码,字符集gb2312 $strForm = &quot;User=. urlencode($strUser);$strForm .= &quot;&amp;Pass=. urlencode($strPass);$strForm .= &quot;&amp;Mobile=. urlencode($strMobile);$strForm .= &quot;&amp;Text=. urlencode($strText);$h= new HttpRequest();$s= $h-request(&quot;GET&quot;,$strServerURL.&quot;?&quot;.$strFor m,&quot;&quot;);if (strpos($s,&quot;SUCCESS&quot;)===false){//出现错误echo (&quot;短信通知发送失败!br.$s);}else {//发送成功echo(&quot;短信通知发送成功!&quot;);}}htmlheadtitle发送短信通知/titlemeta http-equiv=&quot;Content-Typecontent=&quot;text/html; charset=gb2312&quot;/headbodybrdiv class=&quot;title1&quot;发送短信通知/divdiv class=&quot;content1&quot;$strMobile=&quot;132****9999&quot;;//接收短信的手机号码 $strText=&quot;Test SMS&quot;;//短信内容(不要超过69个字) smsend($strMobile,$strText);/div/body/htmlphp //httprequest.phpclass HttpRequest{var $_host;var $_uri;var $_port;var $_response;function parseURL($url){$req = $url;$pos = strpos($req, &#39;://&#39;);$this-_protocol = strtolower(substr($req, 0, $pos));$req = substr($req, $pos+3);$pos = strpos($req, &#39;/&#39;);if($pos === false)$pos = strlen($req);$host = substr($req, 0, $pos);if(strpos($host, &#39;:&#39;) === false){$this-_host = $host;$this-_port = ($this-_protocol == &#39;https&#39;) ? 443 : 80;}else{list($this-_host, $this-_port) = explode(&#39;:&#39;, $host);}$this-_uri = substr($req, $pos);if($this-_uri == &#39;&#39;)$this-_uri = &#39;/&#39;;}function request($method , $url, $sPostData){$this-parseURL($url);$fp = pfsockopen( $this-_host, $this-_port, &amp;$errno, &amp;$errstr, 120); if( !$fp ) {echo &quot;$errstr ($errno)br\n&quot;;return &quot;&quot;;}if( strtoupper($method) == &quot;GET&quot;){fputs( $fp, &quot;GET &quot;.$this-_uri.HTTP/1.0\r\n&quot;); }else if( strtoupper($method) == &quot;POST) {fputs( $fp, &quot;POST &quot;.$this-_uri.HTTP/1.0\r\n&quot;); }fputs( $fp, &quot;Accept: */*\n&quot;);fputs( $fp, &quot;Host: &quot;.$this-_host.&quot;\r\n&quot;);fputs( $fp, &quot;Connection: Close\r\n&quot;);if( strtoupper($method) == &quot;POST) {$strlength = strlen( $data);fputs( $fp, &quot;Content-type:application/x-www-form-urlencoded\r\n); fputs( $fp, &quot;Content-length: &quot;.$strlength.&quot;\r\n&quot;);fputs($fp, &quot;\r\n&quot;);fputs( $fp, $data.&quot;\r\n&quot;);}else{fputs($fp, &quot;\r\n&quot;);}$this-_response = &quot;&quot;;while( !feof( $fp ) ) {$this-_response .= fgets( $fp, 4096);}fclose( $fp);$s = $this-getResponseBody();return $s;}function getResponse(){return $this-_response;}function getResponseBody(){$sKey = &quot;\r\n\r\n&quot;;$pos = strpos($this-_response,$sKey);if($pos===false) return &quot;&quot;;$str= substr($this-_response,$pos + 4);return $str;}}篇三:用免费短信验证码SDK实现手机注册验证功能用免费短信验证码SDK实现手机注册验证功能第一步获取短信SDK请到Mob官网下载最新版本的SDK,下载回来后解压,可以看到下面的文件结构:其中SMS_SDK.framework 为依赖库文件SMS_SDKDemo 为示例demo ,其中保存了短信SDK的演示项目代码。

完整注册登陆php源码,附带session验证。

完整注册登陆php源码,附带session验证。

完整注册登陆php源码,附带session验证。

1、⾸先先写表单页⾯login.html.<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>⽤户登陆</title></head><!-- 定义输⼊表单样式 --><style type="text/css">html{font-size: 12px;}fieldset{width:200px;margin:0 auto;}legend{font-weight: bold; font-size: 14px;}label{float:left; width:70px; margin-left:10px;}.left{margin-left:80px;}.input{width:150px;}span{color: #666666;}</style><!-- 验证表单是否输⼊ --><script type="text/javascript">function InputCheck(LoginForm){if(ername.value==''){alert('请输⼊⽤户名!');ername.focus();return (false);}if(LoginForm.password.value==''){alert('请输⼊密码!');LoginForm.password.focus();return (false);}}</script><body><div><fieldset><legend>⽤户登陆</legend><form name="LoginForm" method="post" action="login.php" onSubmit="return InputCheck(this)"><p><lable for="username" class="lable">⽤户名:</lable><input id="username" name="username" type="text" class="input" /></p><p><lable for="password" class="lable">密 码:</lable><input id="password" name="password" type="text" class="input" /></p><p><input name="submit" value="提交" type="submit" /> <a href="reg.html">点此注册</a></p></form></fieldset></div></body></html>2、然后写登陆源码。

实用的PHP实例代码20个2篇

实用的PHP实例代码20个2篇

实用的PHP实例代码20个2篇PHP是一种广泛应用于Web开发的脚本语言,具有简单、灵活、易学的特点。

它不仅可以用来开发网站,还可以用来编写各种实用的应用程序。

在本文中,我们将为您介绍20个实用的PHP实例代码和使用场景。

第一篇:1-10个实例1. 文件上传文件上传是Web开发中常用的功能之一。

使用PHP,您可以很容易地实现文件上传功能,从而让用户能够向您的网站或应用程序上传文件。

2. 邮件发送PHP提供了发送电子邮件的功能,您可以使用PHP编写代码来发送电子邮件,例如发送注册确认邮件、找回密码邮件等。

3. 图片缩放PHP提供了强大的图像处理功能,您可以使用PHP来缩放图片,为您的网站或应用程序提供更好的用户体验。

4. 数据库连接在许多Web应用程序中,需要与数据库进行交互。

PHP提供了各种数据库连接操作,您可以使用PHP来连接各种类型的数据库,如MySQL、Oracle等。

5. 表单验证表单验证是保证用户输入数据有效和安全的重要环节。

PHP提供了丰富的表单验证函数,您可以使用PHP来验证用户提交的表单数据,例如检查邮箱格式、密码强度等。

6. 分页功能在处理大量数据时,分页功能非常有用。

使用PHP,您可以轻松地实现分页功能,让用户能够浏览和导航数据的不同页面。

7. 登录认证登录认证是保护网站或应用程序安全的重要步骤。

使用PHP,您可以编写代码来实现用户登录认证功能,例如检查用户名和密码是否匹配等。

8. 数据加密在处理敏感信息时,数据加密是非常重要的。

PHP提供了各种数据加密函数,您可以使用PHP来对敏感数据进行加密和解密。

9. 生成验证码验证码是防止机器人和恶意攻击的有效手段。

使用PHP,您可以生成随机验证码,并将其嵌入到表单中,确保只有人类用户能够提交表单。

10. 数据备份定期数据备份是保证数据安全的重要环节。

使用PHP,您可以编写脚本来自动备份数据库,确保数据的安全可靠。

第二篇:11-20个实例11. 数据导出有时候,需要将数据库中的数据导出为Excel、CSV等格式,以方便进行数据分析或其他用途。

微信公众号后台PHP源代码

微信公众号后台PHP源代码

<?php/*doufudiy supportCopyRight 2014 All Rights Reserved*/define("TOKEN", "doufudiy");define("AppID", "wx9b24c99e83238b21");define("EncodingAESKey", "ww1bzDRcAy84UOGNaxL230A9tdBBOWgKQkYviIc6CFc"); define("APP_SECRET", "267980781c9addd54fcf811ea7acb59d");//改成自己的APPSECRET$wechatObj = new wechatCallbackapiTest();$wechatObj->responseMsg();class wechatCallbackapiTest{private $app_id;private $app_secret;public function valid(){$echoStr = $_GET["echostr"];//valid signature , optionif($this->checkSignature()){ob_clean();echo $echoStr;exit;}}function txt($fu,$tu,$content,$flag = 0){$tpl="<xml><ToUserName><![CDATA[".$fu."]]></ToUserName><FromUserName><![CDATA[".$tu."]]></FromUserName><CreateTime>".$_SERVER['REQUEST_TIME']."</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[".$content."]]></Content><FuncFlag>".$flag."</FuncFlag></xml>";echo $tpl;}function news($fu,$tu,$data,$flag = 0){$num=count($data);if($num > 1){$add = $this->news_add($data);$tpl = " <xml><ToUserName><![CDATA[".$fu."]]></ToUserName><FromUserName><![CDATA[".$tu."]]></FromUserName><CreateTime>".$_SERVER['REQUEST_TIME']."</CreateTime><MsgType><![CDATA[news]]></MsgType><Content><![CDATA[%s]]></Content><ArticleCount>".$num."</ArticleCount><Articles>".$add."</Articles><FuncFlag>".$flag."</FuncFlag></xml> ";echo $tpl;}else{$tpl = " <xml><ToUserName><![CDATA[".$fu."]]></ToUserName><FromUserName><![CDATA[".$tu."]]></FromUserName><CreateTime>".$_SERVER['REQUEST_TIME']."</CreateTime><MsgType><![CDATA[news]]></MsgType><Content><![CDATA[%s]]></Content><ArticleCount>1</ArticleCount><Articles><item><Title><![CDATA[".$data[0]['title']."]]></Title><Description><![CDATA[".$data[0]['intro']."]]></Description><PicUrl><![CDATA[".$data[0]['pic']."]]></PicUrl><Url><![CDATA[".$data[0]['url']."]]></Url></item></Articles><FuncFlag>".$flag."</FuncFlag></xml> ";echo $tpl;}}function news_add($data){$add="";foreach ($data as $k){$add.= "<item><Title><![CDATA[".$k['title']."]]></Title><Description><![CDATA[".$k['intro']."]]></Description><PicUrl><![CDATA[".$k['pic']."]]></PicUrl><Url><![CDATA[".$k['url']."]]></Url></item> ";}return $add;}/*function audio($fu,$tu,$data,$flag = 0){$tpl="<xml><ToUserName><![CDATA[".$fu."]]></ToUserName><FromUserName><![CDATA[".$tu."]]></FromUserName><CreateTime>".$_SERVER['REQUEST_TIME']."</CreateTime><MsgType><![CDATA[music]]></MsgType><Music><Title><![CDATA[".$data['title']."]]></Title><Description><![CDATA[".$data['intro']."]]></Description><MusicUrl><![CDATA[".$data['url']."]]></MusicUrl><HQMusicUrl><![CDATA[".$data['hqurl']."]]></HQMusicUrl></Music><FuncFlag>".$flag."</FuncFlag></xml>";echo $tpl;}*/function audio($fu,$tu,$data,$flag = 0){$num=count($data);if($num > 1){$add = $this->audio_add($data);$tpl = " <xml><ToUserName><![CDATA[".$fu."]]></ToUserName><FromUserName><![CDATA[".$tu."]]></FromUserName><CreateTime>".$_SERVER['REQUEST_TIME']."</CreateTime><MsgType><![CDATA[music]]></MsgType><Content><![CDATA[%s]]></Content><MusicCount>".$num."</MusicCount><Musics>".$add."</Musics><FuncFlag>".$flag."</FuncFlag></xml> ";echo $tpl;}else{$tpl = " <xml><ToUserName><![CDATA[".$fu."]]></ToUserName><FromUserName><![CDATA[".$tu."]]></FromUserName><CreateTime>".$_SERVER['REQUEST_TIME']."</CreateTime><MsgType><![CDATA[music]]></MsgType><Content><![CDATA[%s]]></Content><MusicCount>1</MusicCount><Musics><item><Title><![CDATA[".$data['title']."]]></Title><Description><![CDATA[".$data['intro']."]]></Description><MusicUrl><![CDATA[".$data['url']."]]></MusicUrl><HQMusicUrl><![CDATA[".$data['hqurl']."]]></HQMusicUrl></item></Musics><FuncFlag>".$flag."</FuncFlag></xml> ";echo $tpl;}}function audio_add($data){$add="";foreach ($data as $k){$add.= "<item><Title><![CDATA[".$data['title']."]]></Title><Description><![CDATA[".$data['intro']."]]></Description><MusicUrl><![CDATA[".$data['url']."]]></MusicUrl><HQMusicUrl><![CDATA[".$data['hqurl']."]]></HQMusicUrl></item> ";}return $add;}public function receiveEvent($object){$contentStr = "ok!";$fu = (string)$object->FromUserName; //取出用户的账号$tu = (string)$object->ToUserName; //公众账号txt($fu,$tu,'begin receiveEvent',0);/*switch ($object->Event){case "subscribe":$contentStr = "欢迎关注清华纸飞机传媒";break;case "unsubscribe":break;case "CLICK":// $postObj->EventKey;txt($fu,$tu,'回复数字0~50课程号,收听机灵狗英文启蒙课程');switch ($object->EventKey){case "leve0":txt($fu,$tu,'回复数字0~50课程号,收听机灵狗英文启蒙课程');//$contentStr[] = array("Title" =>"机灵狗启蒙英文读物",//"Description" =>"输入数字1~50,听取课程",//"PicUrl"=>"/weixin/weather/icon/cartoon.jpg",//"Url" =>"weixin://addfriend/pondbaystudio");break;case "leve1":$contentStr[] = array("Title" =>"机灵狗启蒙英文读物","Description" =>"输入数字1~50,听取课程","PicUrl" =>"/weixin/weather/icon/cartoon.jpg","Url" =>"http://bbs.binguo.me");break;default:$contentStr[] = array("Title" =>"默认菜单回复","Description" =>"您正在使用的是自定义菜单测试接口","PicUrl" =>"/weixin/weather/icon/cartoon.jpg","Url" =>"http://bbs.binguo.me");break;}break;default:txt($fu,$tu,'receiveEvent default');break;}if (is_array($contentStr)){$resultStr = news($fu,$tu, $contentStr);}else{$resultStr = txt($fu,$tu, $contentStr,0);//txt($fu,$tu,'你发送了数字0 ,所以你就看到了这么多000000000000。

表单源码php

表单源码php

表单源码php以下是一个简单的表单源码的示例,使用PHP编写:```php<!DOCTYPE html><html><head><title>表单示例</title></head><body><?php// 检查表单是否提交if(isset($_POST['submit'])){// 获取表单数据$name = $_POST['name'];$email = $_POST['email'];$message = $_POST['message'];// 验证表单数据if(empty($name) || empty($email) || empty($message)){ echo '请填写所有必填字段。

';} else {// 将数据保存到数据库或发送电子邮件等其他操作// 这里只是简单地显示提交的数据echo '姓名: ' . $name . '<br>';echo '邮箱: ' . $email . '<br>';echo '留言: ' . $message . '<br>';}}><h2>联系我们</h2><form method='POST' action=''><label for='name'>姓名:</label><input type='text' name='name' id='name' required><br><br><label for='email'>邮箱:</label><input type='email' name='email' id='email' required><br><br><label for='message'>留言:</label><br><textarea name='message' id='message'required></textarea><br><br><input type='submit' name='submit' value='提交'> </form></body></html>```这个表单源码使用PHP编写,展示了一个简单的联系我们表单。

php面试题简述微信支付的流程(3篇)

php面试题简述微信支付的流程(3篇)

第1篇一、微信支付简介微信支付是腾讯公司推出的一款便捷的移动支付产品,用户可以通过微信客户端进行线上支付、线下支付等多种支付场景。

微信支付具有安全性高、便捷性强、用户量大等特点,广泛应用于电子商务、O2O、线下零售等多个领域。

二、微信支付流程1. 订单创建(1)商户在后台创建订单,订单信息包括商品名称、订单号、订单金额等。

(2)商户将订单信息发送至微信支付平台。

2. 统一下单(1)微信支付平台收到商户订单信息后,进行订单验证。

(2)验证通过后,微信支付平台生成支付参数,包括订单号、金额、签名等。

(3)微信支付平台将支付参数发送给商户。

3. 发起支付(1)商户将支付参数传递给前端页面。

(2)前端页面根据支付参数生成支付界面,用户进行支付操作。

4. 支付通知(1)用户完成支付后,微信支付平台发送支付通知给商户。

(2)商户接收支付通知,验证通知签名。

(3)验证通过后,商户处理支付结果,如修改订单状态、发送通知给用户等。

5. 退款(1)用户或商户发起退款请求。

(2)商户验证退款请求,将退款信息发送至微信支付平台。

(3)微信支付平台处理退款请求,将退款金额返还给用户。

三、PHP面试题1. 请简述微信支付的基本流程。

答:微信支付的基本流程包括订单创建、统一下单、发起支付、支付通知和退款。

2. 微信支付中,商户需要提供哪些订单信息?答:商户需要提供订单号、商品名称、订单金额等信息。

3. 微信支付中,如何生成支付参数?答:商户可以使用微信支付平台提供的API接口,根据订单信息和商户账号生成支付参数。

4. 在微信支付流程中,支付通知的作用是什么?答:支付通知是微信支付平台通知商户支付结果的一种方式,商户可以通过支付通知处理支付结果,如修改订单状态、发送通知给用户等。

5. 请简述微信支付退款流程。

答:微信支付退款流程包括用户或商户发起退款请求、商户验证退款请求、将退款信息发送至微信支付平台、微信支付平台处理退款请求、退款金额返还给用户。

微信小程序开发之获取用户手机号码——使用简单php接口demo进行加密数据解密

微信小程序开发之获取用户手机号码——使用简单php接口demo进行加密数据解密

微信⼩程序开发之获取⽤户⼿机号码——使⽤简单php接⼝demo进⾏加密数据解密后边要做⼀个微信⼩程序,并要能获取⽤户微信绑定的⼿机号码。

⽽⼩程序开发⽂档上边提供的获取⼿机号码的接⼝(getPhoneNumber())返回的是密⽂,需要服务器端进⾏解密,但是官⽅提供的开发⽂档⼀如既往的乱,如果没有对⼩程序开发⽂档有⼀个整体的了解,搞懂解密流程还是有点难的。

这⾥把⼩程序从请求⽤户授权获取⼿机号码直⾄获取到⼿机号码明⽂的整个流程串了起来,⽅便迅速了解,如下:⼀. 前端相关操作:1. 请求⽤户授权获取⼿机号码:因为需要⽤户主动触发才能发起获取⼿机号接⼝,所以该功能不由 API 来调⽤,需⽤<button>组件的点击来触发,如下:wxml:<button wx:if="{{!phone}}" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber">获取⼿机号码</button>js:1 Page({2 getPhoneNumber: function(e) { 3if(e.detail.errMsg == "getPhoneNumber:fail user deny") return; //⽤户允许授权 4 console.log("lv", e.detail.iv); //包括敏感数据在内的完整⽤户信息的加密数据,需要解密 5 console.log(e.detail.encryptedData); //加密算法的初始向量,解密需要⽤到 6 ......7 }8 })2. 访问⼩程序登录接⼝:⼩程序调⽤wx.login()获取临时登录凭证code,并传到开发者服务器。

Page({getPhoneNumber: function(e) {console.log(e.detail.errMsg)console.log(e.detail.iv) //包括敏感数据在内的完整⽤户信息的加密数据,需要解密console.log(e.detail.encryptedData) //加密算法的初始向量,解密需要⽤到wx.login({success: res => {if(res.code){console.log(res.code)}}})}})3. 访问腾讯服务器的登录凭证校验接⼝:注:官⽅推荐放到服务器端进⾏,这⾥为了⽅便,就放在前端请求了。

易信通平台接口手册(电信用户)

易信通平台接口手册(电信用户)

易信通平台接口手册(电信用户)
EMS平台接口手册
目录
1、引言 (3)
1.1.目的 (3)
1.2.修改历史记录 (3)
1.3.名称解释 (3)
2、短信 (4)
2.1.HTTP接口 (4)
2.1.1.短信发送 (4)
2.1.2.短信接收 (7)
2.1.
3.查询状态报告 (8)
2.1.4.查询余额 (10)
2.1.5.查询关键字 (11)
2.2.W EB S ERVICE接口 (12)
2.2.1.短信发送 (12)
2.2.2.短信接收 (15)
2.2.
3.查询状态报告 (16)
2.2.4.查询余额 (18)
2.2.5.查询关键字 (19)
附录:公共错误代码定义 (27)
1、引言
1.1.目的
该接口手册编写目的在于描述企业信息系统(以下简称EMS)具体的接口协议,供接口用户进行接口的对接开发。

1.2.修改历史记录
1.3.名称解释
2、短信
2.1.h ttp接口
2.1.1.短信发送
功能:发送短信
地址:http://119.145.9.12/sendSMS.action 备注:建议采用post方法提交请求。

请求参数定义如下:
返回结果以xml形式返回,详细参数及示例如下:
1。

PHPEMS微信端设置教程

PHPEMS微信端设置教程

PHPEMS微信端设置教程
1、普通使用设置:请百度搜索微信公众账号,进入后按照公众账号后台设
置即可,本教程不再介绍。

2、第三方微信接口支持:本教程重点介绍此方法,使用之前请确保已经申
请好微信公众账号。

3、进入微信公众平台管理(/),如下图
注意此处要处于开启状态
不是开发者的此处会显示申请成为开发者,是免费的,似乎要验证下手机号
打开到此处后先不管,不要关闭,进行第四步。

4、打开,注册一个账号登录,然后进入如下页面
将列表中的url后的网址填入刚才打开的微信后台的此处
注意,复制时可能前后带有空格,一定要把空格删除掉,否则验证不过去。

token和url一样设置,保持两边token一致。

微信状态要设置为验证状态。

提交后出现类似提示,如果出现错误提示,可能是因为网络问题导致,请稍等一会儿再进行提交,提交后,修改状态为正常。

如上图。

5、设置完成后进入消息设置
消息设置比较简单,注意关注消息是指用户关注公众号后,公众号自动向用户发出一个消息,只在关注时发一次,自动回复消息是用户向公众号对话时回复的消息,请都使用图文消息,如图
在链接里填入你手机端的网址,默认为你的网址加index.php?exam-phone,如你的网址是,则填写
/index.php?exam-phone
6、设置完成后,即可关注自己的订阅号或者服务号查看效果。

微信公众平台java接口BAE简单版(含验证接口、各种信息)

微信公众平台java接口BAE简单版(含验证接口、各种信息)

//说明,使用dom4j框架,自行导入,在BAE测试通过。

接口验证未用token加密。

有疑问可入qq群196673544package test;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.io.SAXReader;public class HelloWorldServlet extends HttpServlet {/****/private static final long serialVersionUID = 1L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// TODO Auto-generated method stubresp.setContentType("text/html;charset=UTF-8");PrintWriter pw = resp.getWriter();String echo = req.getParameter("echostr");echo = new String(echo.getBytes("ISO-8859-1"),"UTF-8");pw.println(echo);}public void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.setCharacterEncoding("utf-8");req.setCharacterEncoding("utf-8");ServletInputStream weixinstr = req.getInputStream();SAXReader Reader = new SAXReader();try {Document document = Reader.read(weixinstr);String fromusername=document.selectSingleNode("//FromUserName").getText();String tousername=document.selectSingleNode("//ToUserName").getText();String msgtype=document.selectSingleNode("//MsgType").getText();String createtime=document.selectSingleNode("//CreateTime").getText();String reply = null ;if (msgtype.equals("location")){String latitude=document.selectSingleNode("//Location_X").getText();String longitude=document.selectSingleNode("//Location_Y").getText();reply="你的是纬度"+latitude+"经度是"+longitude;}else if (msgtype.equals("image")){reply="你发的是图片";}else if(msgtype.equals("text")){String content=document.selectSingleNode("//Content").getText();if (content.equals("1")){reply="公司简介";}else if (content.equals("2")){reply="最新产品";}else {reply="默认回复";}}else if(msgtype.equals("event")){String event=document.selectSingleNode("//Event").getText();if (event.equals("subscribe")){reply="感谢你的关注";}}else{reply="功能未开发";}StringBuffer respMessage = new StringBuffer();respMessage.append(("<xml><ToUserName><![CDA TA["+fromusername+"]]></ToUserNa me><FromUserName><![CDA TA["+tousername+"]]></FromUserName><CreateTime><![CDAT A["+createtime+"]]></CreateTime><MsgType><![CDA TA[text]]></MsgType><Content><![CD ATA["+reply+"]]></Content><FuncFlag>0</FuncFlag></xml>"));PrintWriter pw = resp.getWriter();pw.println(respMessage);} catch (DocumentException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}。

php(ThinkPHP)实现微信小程序的登录过程

php(ThinkPHP)实现微信小程序的登录过程

php(ThinkPHP)实现微信⼩程序的登录过程源码也在github中给出https:///wulongtao/think-wxminihelper下⾯结合thinkPHP框架来实现以下微信⼩程序的登录流程,这些流程是结合了官⽹和github的⼀个⽹站综合实现的https:///debug/wxadoc/dev/api/api-login.html?t=2017112#wxloginobjecthttps:///cantoo/learning-wxapp/blob/master/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%99%BB%E5%BD%95%E6%80%81%E9%AA%8C%E8%AF%81%E6%B5%81%E7%A8%8B.md 把登录流程做了⼀下简单的封装,也可以直接使⽤composer下载直接使⽤:composer require xxh/think-wxminihelper1:登录流程图参考了如下两个图:按照上⾯的步骤,代码实现如下:⼩程序端代码:/*** 登录*/function wxLogin(func) {//调⽤登录接⼝//1.⼩程序调⽤wx.login得到code.wx.login({success: function (res) {var code = res['code'];//2.⼩程序调⽤wx.getUserInfo得到rawData, signatrue, encryptData.wx.getUserInfo({success: function (info) {console.log(info);var rawData = info['rawData'];var signature = info['signature'];var encryptData = info['encryptData'];var encryptedData = info['encryptedData']; //注意是encryptedData不是encryptData...坑啊var iv = info['iv'];//3.⼩程序调⽤server获取token接⼝, 传⼊code, rawData, signature, encryptData.wx.request({url: constants.LOGIN_URL,data: {"code" : code,"rawData" : rawData,"signature" : signature,"encryptData" : encryptData,'iv' : iv,'encryptedData': encryptedData},success: function(res) {if(res.statusCode != 200) {wx.showModal({title: '登录失败'});}typeof func == "function" && func(res.data);}});}});}});}后台PHP代码:public function wxLogin() {/*** 3.⼩程序调⽤server获取token接⼝, 传⼊code, rawData, signature, encryptData.*/$code = input("code", '', 'htmlspecialchars_decode');$rawData = input("rawData", '', 'htmlspecialchars_decode');$signature = input("signature", '', 'htmlspecialchars_decode');$encryptedData = input("encryptedData", '', 'htmlspecialchars_decode');$iv = input("iv", '', 'htmlspecialchars_decode');/*** 4.server调⽤微信提供的jsoncode2session接⼝获取openid, session_key, 调⽤失败应给予客户端反馈* , 微信侧返回错误则可判断为恶意请求, 可以不返回. 微信⽂档链接* 这是⼀个 HTTP 接⼝,开发者服务器使⽤登录凭证 code 获取 session_key 和 openid。

【微信公众平台开发教程】PHP微信支付开发

【微信公众平台开发教程】PHP微信支付开发

【微信公众平台开发教程】PHP微信支付开发
1.开发环境
Thinkphp 3.2.3
微信:服务号,已认证
开发域名: (自定义的域名,外网不可访问)
2.需要相关文件和权限
微信支付需申请开通
微信公众平台开发公开课:/weixin/index.php?id=1
微信公众平台开发者文档:/wiki/home/index.html
微信支付开发者文档:https:///wiki/doc/api/index.html
微信支付SDK下载地址:https:///wiki/doc/api/jsapi.php?chapter=11_1
3.开发
下载好微信支付PHP版本的SDK,文件目录为下图:
把微信支付SDK的Cert和Lib目录放入Thinkphp,目录为
现在介绍微信支付授权目录问题,首先是微信支付开发配置里面的支付授权目录填写,
然后填写JS接口安全域。

最后设置网页授权
这些设置完,基本完成一半,注意设置的目录和我thinkphp里面的目录。

4.微信支付配置
把相关配置填写正确。

到这里基本上完成,可以在微信端打开/Charge/index.php/Test/index/我的环境,HTTP服务器没有重写url,微信支付继续探索中,有些地方可能写的有问题或不足,望大家谅解,互相学习。

PHP对接抖音开发平台接口的详细教程

PHP对接抖音开发平台接口的详细教程

PHP对接抖⾳开发平台接⼝的详细教程⽬录⼀、说明⼆、代码三、代码运⾏需知四、功能扩展五、接⼝调⽤需要注意的点六、接⼝⽂档中的 ‘坑'(以订单列表接⼝为例)1、请求参数、响应参数代表的具体值不清晰⼀、说明⼆、代码<?phpnamespace app\common\libs;use app\common\exception\BaseException;/*** Class DouYinApi* @package app\common\libs*/class DouYinApi{private $host; //抖⾳接⼝API,API调⽤指南:https:///docs/guide-docs/148/814private $appKey; //appKeyprivate $appSecret; //appSecretprivate $accessToken; //访问令牌private $refreshToken; //刷新令牌private $versionNumber; //API协议版本,当前版本为 2private $versionNumberStr; //API协议版本,当前版本为 v2public function __construct(){$this->host = 'https://'; //接⼝访问地址$this->appKey = '你的抖⾳后台的appKey';$this->appSecret = '你的抖⾳后台的appSecret';$this->versionNumber = '2';$this->versionNumberStr = 'v' . $this->versionNumber;//获取access_token,refresh_token放到最后,如果其他的如versionNumber在后⾯设置则报错:"v不可为空",因为handleToken中调⽤了versionNumber,但versionNumber此时的值为NULL $result = self::handleToken(); //创建Token// $result = self::handleToken(false); //刷新Token:提⽰-"缺少code",需要建⼀张第三⽅表存抖⾳该店铺的access_token,refresh_token,expire_time信息$this->accessToken = $result['access_token']; //⽤于出创建token接⼝之外的其他接⼝$this->refreshToken = $result['refresh_token']; //⽤于刷新token接⼝}/*** 处理(创建/刷新)Token的⽅法* 开发指南 > 产品功能 > 授权介绍 -> ⾃⽤型应⽤店铺授权流程:https:///docs/guide-docs/9/21* @param bool $createToken 是否调⽤创建Token的⽅法* @return array* @throws BaseException*/public function handleToken($createToken = true){if ($createToken) { //调⽤创建token接⼝$param = ['code' => '','grant_type' => 'authorization_self','shop_id' => '你抖⾳店铺的ID', //店铺ID,仅⾃⽤型应⽤有效;若不传,则默认返回最早授权成功店铺对应的token信息];$method = 'token.create';} else { //调⽤刷新Token⽅法$param = [// 'app_id' => '', //应⽤key ,长度19位字母和数字组合的字符串,可不传'refresh_token' => $this->refreshToken, //注意:传真实的refreshToken值,⽽不是传REFRESH_TOKEN'grant_type' => 'refresh_token',];$method = 'token.refresh';}$timestamp = time(); //接⼝请求前记录开始时间,防⽌过期时间$expireTime失效$result = self::fetch($method, $param);if ($result['code'] != 10000) { //请求失败throw new BaseException($result['message']);} else {$data = $result['data'];$accessToken = $data['access_token']; //accessToken$refreshToken = $data['refresh_token']; //refreshToken$expireTime = $timestamp + $data['expires_in']; //Token过期时间 = 当前时间 + 有效时间(秒s)return ['access_token' => $accessToken,'refresh_token' => $refreshToken,];}}/*** 封装抖⾳接⼝公共⽅法* PHP调⽤说明:https:///docs/guide-docs/151/811* @param $method ⽅法名:格式 token.create ⽅法中转为 token/create* @param $param 请求接⼝需要的参数名* @param bool $accessToken url中是否要加上access_token,默认否。

php实现微信公众号主动推送消息

php实现微信公众号主动推送消息

php实现微信公众号主动推送消息通过学习借鉴朋友的实现⽅法进⾏整理,实现了PHP版的微信公共平台消息主动推送,分享给⼤家供⼤家参考,具体内容如下此⽅法是通过模拟登录微信公共平台的⽅法来实现的。

代码如下:⼀、登录接⼝部分代码//登录private function login(){$url = 'https:///cgi-bin/login?lang=zh_CN';$this->send_data = array('username' => $this->_account,'pwd' => md5($this->_password),'f' => 'json');$this->referer = "https:///";$this->getHeader = 1;$result = explode("\n",$this->curlPost($url));foreach ($result as $key => $value) {$value = trim($value);if(preg_match('/"ErrCode": (.*)/i', $value,$match)){//获取tokenswitch ($match[1]) {case -1:die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"系统错误")));case -2:die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"帐号或密码错误")));case -3:die(urldecode(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>urlencode("密码错误")))));case -4:die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"不存在该帐户")));case -5:die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"访问受限")));case -6:die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"需要输⼊验证码")));case -7:die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"此帐号已绑定私⼈微信号,不可⽤于公众平台登录")));case -8:die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"邮箱已存在")));case -32:die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"验证码输⼊错误")));case -200:die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"因频繁提交虚假资料,该帐号被拒绝登录")));case -94:die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"请使⽤邮箱登陆")));case 10:die(json_encode(array('status'=>1,'errCode'=>$match[1],'msg'=>"该公众会议号已经过期,⽆法再登录使⽤")));case 0:$this->userFakeid = $this->getUserFakeid();break;}}if(preg_match('/^set-cookie:[\s]+([^=]+)=([^;]+)/i', $value,$match)){//获取cookie$this->cookie .=$match[1].'='.$match[2].'; ';}if(preg_match('/"ErrMsg"/i', $value,$match)){//获取token$this->token = rtrim(substr($value,strrpos($value,'=')+1),'",');}}}⼆、信息发送部分代码//单发消息private function send($fakeid,$content){$url = 'https:///cgi-bin/singlesend?t=ajax-response&lang=zh_CN';$this->send_data = array('type' => 1,'content' => $content,'error' => 'false','tofakeid' => $fakeid,'token' => $this->token,'ajax' => 1,);$this->referer = 'https:///cgi-bin/singlemsgpage?token='.$this->token.'&fromfakeid='.$fakeid.'&msgid=&source=&count=20&t=wxm-singlechat&lang=zh_CN'; return $this->curlPost($url);}三、群发信息代码//群发消息public function sendMessage($content='',$userId='') {if(is_array($userId) && !empty($userId)){foreach($userId as $v){$json = json_decode($this->send($v,$content));if($json->ret!=0){$errUser[] = $v;}}}else{foreach($this->userFakeid as $v){$json = json_decode($this->send($v['fakeid'],$content));if($json->ret!=0){$errUser[] = $v['fakeid'];}}}//共发送⽤户数$count = count($this->userFakeid);//发送失败⽤户数$errCount = count($errUser);//发送成功⽤户数$succeCount = $count-$errCount;$data = array('status'=>0,'count'=>$count,'succeCount'=>$succeCount,'errCount'=>$errCount,'errUser'=>$errUser);return json_encode($data);}四、获取所有⽤户信息代码⽚段//获取所有⽤户信息public function getAllUserInfo(){foreach($this->userFakeid as $v){$info[] = $this->getUserInfo($v['groupid'],$v['fakeid']);}return $info;}//获取⽤户信息public function getUserInfo($groupId,$fakeId){$url = "https:///cgi-bin/getcontactinfo?t=ajax-getcontactinfo&lang=zh_CN&fakeid={$fakeId}";$this->getHeader = 0;$this->referer = 'https:///cgi-bin/contactmanagepage?token='.$this->token.'&t=wxm-friend&lang=zh_CN&pagesize='.$this->pageSize.'&pageidx=0&type=0&groupid='.$groupId; $this->send_data = array('token'=>$this->token,'ajax'=>1);$message_opt = $this->curlPost($url);return $message_opt;}//获取所有⽤户fakeidprivate function getUserFakeid(){ini_set('max_execution_time',600);$pageSize = 1000000;$this->referer = "https:///cgi-bin/home?t=home/index&lang=zh_CN&token={$_SESSION['token']}";$url = "https:///cgi-bin/contactmanage?t=user/index&pagesize={$pageSize}&pageidx=0&type=0&groupid=0&token={$this->token}&lang=zh_CN";$user = $this->vget($url);$preg = "/\"id\":(\d+),\"name\"/";preg_match_all($preg,$user,$b);$i = 0;foreach($b[1] as $v){$url = 'https:///cgi-bin/contactmanage?t=user/index&pagesize='.$pageSize.'&pageidx=0&type=0&groupid='.$v.'&token='.$this->token.'&lang=zh_CN';$user = $this->vget($url);$preg = "/\"id\":(\d+),\"nick_name\"/";preg_match_all($preg,$user,$a);foreach($a[1] as $vv){$arr[$i]['fakeid'] = $vv;$arr[$i]['groupid'] = $v;$i++;}}return $arr;}希望本⽂所述对⼤家学习php程序设计有所帮助。

微信公众平台开发接口

微信公众平台开发接口

微信公众平台开发接口一、消息接口二、通用接口三、自定义菜单接口四、使用限制五、返回码说明消息接口指南返回出自开放平台跳转到:导航, 搜索目录[隐藏]• 1 简介• 2 申请消息接口• 3 网址接入• 4 消息推送o 4.1 文本消息o 4.2 图片消息o 4.3 地理位置消息o 4.4 链接消息o 4.5 事件推送• 5 消息回复o 5.1 回复文本消息o 5.2 回复音乐消息o 5.3 回复图文消息• 6 注意事项•7 示例代码简介公众平台消息接口为开发者提供了一种新的消息处理方式。

申请消息接口点击申请,填写网址url和token,其中token可由开发者可以任意填写,用作生成签名。

网址接入公众平台用户提交信息后,微信服务器将发送GET请求到填写的URL上,并且带上四个参数:参数描述signature 微信加密签名timestamp 时间戳nonce 随机数echostr 随机字符串开发者通过检验signature对请求进行校验(下面有校验方式)。

若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败。

signature结合了开发者填写的token参数和请求中的timestamp参数、nonce 参数。

加密/校验流程:1. 将token、timestamp、nonce三个参数进行字典序排序2. 将三个参数字符串拼接成一个字符串进行sha1加密3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信消息推送当普通微信用户向公众账号发消息时,微信服务器将POST该消息到填写的URL 上。

结构如下:文本消息<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[this is a test]]></Content><MsgId>1234567890123456</MsgId>图片消息<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[image]]></MsgType><PicUrl><![CDATA[this is a url]]></PicUrl><MsgId>1234567890123456</MsgId>地理位置消息<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1351776360</CreateTime><MsgType><![CDATA[location]]></MsgType><Location_X>23.134521</Location_X><Location_Y>113.358803</Location_Y><Scale>20</Scale><Label><![CDATA[位置信息]]></Label><MsgId>1234567890123456</MsgId>链接消息<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1351776360</CreateTime><MsgType><![CDATA[link]]></MsgType><Title><![CDATA[公众平台官网链接]]></Title><Description><![CDATA[公众平台官网链接]]></Description><Url><![CDATA[url]]></Url><MsgId>1234567890123456</MsgId>事件推送事件推送只支持微信4.5版本,目前开启自定义菜单接口事件推送、关注与取消关注事件推送。

PHP微信扫码支付DEMO,thinkphp5+微信支付

PHP微信扫码支付DEMO,thinkphp5+微信支付

PHP微信扫码⽀付DEMO,thinkphp5+微信⽀付PS:微信⽀付基础条件1.⼀个认证的服务号2.在服务号后台申请微信⽀付,成功后获得⼀个商户号3.在商户号⾥⾯选择native⽀付,这个就是扫码⽀付,按照提⽰开通这项。

4.按照微信⽀付⽂档的说法,扫码⽀付分两种模式模式⼀:⽣成的⼆维码没有失效性,但是操作⽐较复杂,中间步骤⽐较多,容易出现很多问题。

模式⼆:⽣成的⼆维码有两⼩时时间限制,但是我感觉也⼗分够⽤了,这个步骤⽐较简单,很容易实现。

按照时序图,⼤概也就分两步代码结构:配置⽂件:微信⽀付类:<?php/** To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates* and open the template in the editor.*/namespace tools;use think\Config;/*** Description of WxPay** @author admin*/class WxPay {/*** 获取签名* @param type $arr* @return type*/public function getSign($arr)//去除数组的空值array_filter($arr);if(isset($arr['sign'])){unset($arr['sign']);}//排序ksort($arr);//组装字符$str = $this->arrToUrl($arr) . '&key=' . Config::get('wx_pay')['key'];//使⽤md5 加密转换成⼤写return strtoupper(md5($str));}/*** 校验签名* @param type $arr* @return boolean*/public function checkSign($arr){//⽣成新签名$sign = $this->getSign($arr);//和数组中原始签名⽐较if($sign == $arr['sign']){return true;}else{return false;}}/*** 获取带签名的数组* @param array $arr* @return type*/public function setSign($arr){$arr['sign'] = $this->getSign($arr);return $arr;}/*** 数组转URL字符串不带key* @param type $arr* @return type*/public function arrToUrl($arr){return urldecode(http_build_query($arr));}/*** 记录到⽂件* @param type $file* @param type $data*/public function logs($file,$data){$data = is_array($data) ? print_r($data,true) : $data;file_put_contents('./public/paylogs/' .$file, $data);}/*** 接收POST推送* @return type*/public function getPost(){return file_get_contents('php://input');}/*** Xml ⽂件转数组* @param type $xml* @return string*/public function XmlToArr($xml){if($xml == '') return'';libxml_disable_entity_loader(true);$arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);return $arr;}/*** 数组转XML* @param type $arr* @return string*/public function ArrToXml($arr){if(!is_array($arr) || count($arr) == 0) return'';$xml = "<xml>";foreach ($arr as $key=>$val){if (is_numeric($val)){$xml.="<".$key.">".$val."</".$key.">";}else{$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";}}$xml.="</xml>";return $xml;}/*** 发送POST请求* @param type $url* @param type $postfields* @return typepublic function postStr($url,$postfields){$ch = curl_init();$params[CURLOPT_URL] = $url; //请求url地址$params[CURLOPT_HEADER] = false; //是否返回响应头信息$params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回$params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向$params[CURLOPT_POST] = true;$params[CURLOPT_SSL_VERIFYPEER] = false;//禁⽤证书校验$params[CURLOPT_SSL_VERIFYHOST] = false;$params[CURLOPT_POSTFIELDS] = $postfields;curl_setopt_array($ch, $params); //传⼊curl参数$content = curl_exec($ch); //执⾏curl_close($ch); //关闭连接return $content;}/*** 统⼀下单* @param type $params* @return boolean*/public function unifiedorder($params){//获取到带签名的数组$params = $this->setSign($params);//数组转xml$xml = $this->ArrToXml($params);//发送数据到统⼀下单API地址$data = $this->postStr(Config::get('wx_pay')['uourl'], $xml);$arr = $this->XmlToArr($data);if($arr['result_code'] == 'SUCCESS' && $arr['return_code'] == 'SUCCESS'){return $arr;}else{$this->logs('error.txt', $data);return false;}}}index控制器演⽰代码<?phpnamespace app\index\controller;use app\common\controller\HomeBase;use tools\WxPay;use think\Config;use phpqrcode\ApiQrcode;use think\Request;use think\Cache;use tools\RetJosn;class Index extends HomeBase {/*** ⾸页* @param WxPay $wxpay* @return mixed*/public function index(WxPay $wxpay) {//$wxpay->logs('log.txt',['213123','123123123']);echo 'index';}/*** 扫码⽀付-模式⼆* @param WxPay $wxpay*/public function index2(Request $request, WxPay $wxpay) {if ($request->isGet()) {return $this->fetch();}}/*** 统⼀下单,⽣成⼆维码*/public function getQrUrl(Request $request) {$pid = $request->get('id');//调⽤统⼀下单API$params = ['appid' => Config::get('wx_pay')['appid'],'mch_id' => Config::get('wx_pay')['mchid'],'nonce_str' => md5(time()),'body' => '订单号:'.$pid,'out_trade_no' => $pid,'total_fee' => 2,'spbill_create_ip' => $_SERVER['SERVER_ADDR'],'notify_url' => Config::get('wx_pay')['notify'],'trade_type' => 'NATIVE','product_id' => $pid];$wxpay = new WxPay();$arr = $wxpay->unifiedorder($params);if (!empty($arr['code_url'])) {Cache::set('send' . $params['out_trade_no'], $params['total_fee'], 3600); ApiQrcode::png($arr['code_url']);} else {return'下单失败!';}}/*** 接收腾讯推送⽀付通知* @param WxPay $wxpay*/public function backOrder(WxPay $wxpay) {try {// 获取腾讯传回来的通知数据$xml = $wxpay->getPost();// 将XML格式的数据转换为数组$arr = $wxpay->XmlToArr($xml);$wxpay->logs('logs.txt', '1');// 验证签名if ($wxpay->checkSign($arr)) {Cache::set('back'.$arr['out_trade_no'],$arr['total_fee'],3600);}$wxpay->logs('logs.txt', '2');$params = ['return_code' => 'SUCCESS','return_msg' => 'OK'];echo $wxpay->ArrToXml($params);} catch (\Exception $e) {$wxpay->logs('logs.txt', $e->getMessage());exit();}}/*** 查询⽀付状态* @param Request $request* @return type*/public function checkSuccess(Request $request){$pid = $request->get('id');if (Cache::get('send'.$pid) == Cache::get('back'.$pid)) {return RetJosn::successJson('⽀付成功');} else {return RetJosn::errorJson(Cache::get('send'.$pid).'|'.Cache::get('back'.$pid)); }}}⼆维码页⾯代码:<!DOCTYPE html><!--To change this license header, choose License Headers in Project Properties.To change this template file, choose Tools | Templatesand open the template in the editor.--><html><head><title>TODO supply a title</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"></head><body><div class="btn-box"><button onclick="getQrcode()">刷新⼆维码</button></div><div class="qrcode-box"><img id="qrimg" src=""></div><div class="status-box"><h2 id="status"></h2></div></body><script src="__STATIC__/default/js/jquery-1.9.1.min.js"></script><script>(function () {getQrcode();//⼆维码⽣成})();/*验证码⽣成*/function getQrcode() {var id = getId(10);var url = "{:url('Index/getQrUrl')}" + "?id=" + id;$("#qrimg").attr("src", url);sessionStorage.setItem('id',id);checkSuccess();//轮询⽀付状态}/*⽣成唯⼀Id*/function getId(length){var tmp = Date.parse( new Date() ).toString();tmp = tmp.substr(0,length);return tmp;}/*轮询⽀付状态*/function checkSuccess(){var interval = window.setInterval(function(){var id = sessionStorage.getItem('id');$.ajax({url:"{:url('Index/checkSuccess')}?id=" + id,dataType:'json',success:function(res) {if (res.code == 200) {$('#status').html('订单号:'+id+','+res.msg); clearInterval(interval);}}})},2000)}</script></html>效果演⽰:⽣成⼆维码,并开始启动轮询⼿机上⽀付订单:轮询到成功⽀付的状态:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

<?php
//易信公众平台地址https://plus.yixin.im/login,复制后后缀改为.php
define("TOKEN", "yixin");
$wechatObj = new wechatCallbackapiTest();
if (isset($_GET['echostr'])) {
$wechatObj->valid();
}else{
$wechatObj->responseMsg();
}
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
//valid signature , option
if($this->checkSignature()){
echo $echoStr;
exit;
}
}
public function responseMsg()
{
//get post data, May be due to the different environments
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
//extract post data
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDA TA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$type = $postObj->MsgType;
$customevent = $postObj->Event;
$latitude = $postObj->Location_X;
$longitude = $postObj->Location_Y;
$keyword = trim($postObj->Content);
$time = time();
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDA TA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
switch ($type)
{ case "event";
if ($customevent=="subscribe")
{$contentStr = "感谢你的关注\n回复1查看账号简介\n回复2查看联系方式\n回复3查看法律文书";}
break;
case "image";
$contentStr = "你的图片很棒!";
break;
case "location";
$contentStr = "你的纬度是{$latitude},经度是{$longitude},我已经锁定!";
break;
case "text";
switch($keyword)
{
case "1";
$contentStr = "易伟律师,擅长交通事故、保险纠纷、医疗损害";
break;
case "2";
$contentStr = "联系方式:汕头市金平区华乾大厦703,1341702551,email:30090032@。

";
break;
case "3";
$contentStr = "31离婚协议\n32租房合同\n33交通事故协议书";
break;
default;
$contentStr ="hi";
}
break;
default;
$contentStr ="此项功能尚未开发";
}
$msgType="text";
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else {
echo "";
exit;
}
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
}
?>。

相关文档
最新文档