功能点:

1、  网页授权获得微信用户信息

用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。

注意点:Scope为snsapi_base 只能获得用户的openid,为snsapi_userinfo(会跳出一个授权页面)时可以获得openid,nicknam,sex,province等详见接口文档。

应用场景:第一次需要授权,后面无需授权。

解决方案,第一次为snsapi_userinfo,保存信息,非第一次去检查这个openid是否已存在 如果不存在 跳转至snsapi_userinfo的页面授权,否则就直接从读取信息。

2、  分享接口

该接口较简单,引入js,按照官方文档说明就行

3、  微信支付

开通微信支付功能,下载官方的Demo,lib/WxPay.Config.php 配置各个信息,证书位置建议使用绝对位置,防止被下载。

  1. //后台生成
  2. $tools = new JsApiPay();
  3. $openId = $tools->GetOpenid("?id=".$id."&Id=".$_REQUEST["Id"]."&title=".urlencode($title));
  4. //GetOpenid 官方是无参调用,这里因为获得openid 是跳转根据code来实现原来 request的参数会丢失,所以在跳转的时候把需要的参数加上,需修改下这个方法,注意这里的title 中文的话需转一下
  5. $title=iconv('gbk', 'utf-8',$title);
  6. $trade_no=WxPayConfig::MCHID.date("YmdHis");
  7. $trade_no=$trade_no.rand(100,999);
  8. //统一下单
  9. $input = new WxPayUnifiedOrder();
  10. $input->SetBody($title);
  11. $input->SetAttach($title);
  12. $input->SetOut_trade_no($trade_no);
  13. $input->SetTotal_fee(1);//单位分
  14. $input->SetTime_start(date("YmdHis"));
  15. $input->SetTime_expire(date("YmdHis", time() + 600));
  16. $input->SetGoods_tag("");
  17. $input>SetNotify_url("http://www.xxxxxx.com/notify.php");
  18. $input->SetTrade_type("JSAPI");
  19. $input->SetOpenid($openId);
  20. $order = WxPayApi::unifiedOrder($input);
  21. //参数列表 供JS调用
  22. $jsApiParameters = $tools->GetJsApiParameters($order);
  23. $smarty->assign("jsApiParameters", $jsApiParameters);
  1. //前台调用微信JS api 支付
  2. function jsApiCall()
  3. {
  4.  
  5. WeixinJSBridge.invoke(
  6. 'getBrandWCPayRequest',
  7. <%$jsApiParameters%>,
  8. function(res){
  9. WeixinJSBridge.log(res.err_msg);
  10. //alert(res.err_code+res.err_desc+res.err_msg);
  11.  
  12. }
  13. );
  14. }
  15.  
  16. function callpay()
  17. {
  18.  
  19. if (typeof WeixinJSBridge == "undefined"){
  20. if( document.addEventListener ){
  21. document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
  22. }else if (document.attachEvent){
  23. document.attachEvent('WeixinJSBridgeReady', jsApiCall);
  24. document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
  25. }
  26. }else{
  27. jsApiCall();
  28. }
  29.  
  30. }

回调

  1. <?php
  2.  
  3. require_once "lib/WxPay.Api.php";
  4. require_once 'lib/WxPay.Notify.php';
  5. require_once 'unit/log.php';
  6.  
  7. //初始化日志
  8. $logHandler= new CLogFileHandler("./logs/".date('Y-m-d').'.log');
  9. $log = Log::Init($logHandler, 15);
  10.  
  11. class PayNotifyCallBack extends WxPayNotify
  12. {
  13. //查询订单
  14. public function Queryorder($transaction_id)
  15. {
  16. $input = new WxPayOrderQuery();
  17. $input->SetTransaction_id($transaction_id);
  18. $result = WxPayApi::orderQuery($input);
  19. Log::DEBUG("query:" . json_encode($result));
  20. if(array_key_exists("return_code", $result)
  21. && array_key_exists("result_code", $result)
  22. && $result["return_code"] == "SUCCESS"
  23. && $result["result_code"] == "SUCCESS")
  24. {
  25. return true;
  26. }
  27. return false;
  28. }
  29.  
  30. //重写回调处理函数
  31. public function NotifyProcess($data, &$msg)
  32. {
  33.  
  34. Log::DEBUG("call back:" . json_encode($data));
  35. $notfiyOutput = array();
  36.  
  37. if(!array_key_exists("transaction_id", $data)){
  38. $msg = "输入参数不正确";
  39. return false;
  40. }
  41. //查询订单,判断订单真实性
  42. if(!$this->Queryorder($data["transaction_id"])){
  43. $msg = "订单查询失败";
  44. return false;
  45. }
  46. //根据 $data["out_trade_no"] 订单号 更新订单状态
  47. //执行更新
  48.  
  49. return true;
  50. }
  51. }
  52.  
  53. Log::DEBUG("begin notify");
  54. $notify = new PayNotifyCallBack();
  55. $notify->Handle(false);

4、  后台自动发送红包接口

构建发送信息,红包金额1-200之间  0~8点不触发!

  1. function curl_post_ssl($url, $vars, $second=30,$aHeader=array())
  2. {
  3. $ch = curl_init();
  4.  
  5. curl_setopt($ch,CURLOPT_TIMEOUT,$second);
  6. curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
  7.  
  8. //curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
  9. //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
  10. curl_setopt($ch,CURLOPT_URL,$url);
  11. curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
  12. curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
  13.  
  14. //curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
  15. //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/cert.pem');
  16.  
  17. curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
  18. curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/cert/rootca.pem');
  19. curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
  20. curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/cert/apiclient_cert.pem');
  21.  
  22. curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
  23. curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/cert/apiclient_key.pem');
  24.  
  25. //curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
  26. //curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/private.pem');
  27.  
  28. //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');
  29.  
  30. if( count($aHeader) >= 1 ){
  31. curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
  32. }
  33.  
  34. curl_setopt($ch,CURLOPT_POST, 1);
  35. curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
  36. $data = curl_exec($ch);
  37. if($data){
  38. curl_close($ch);
  39. return $data;
  40. }
  41. else {
  42. $error = curl_errno($ch);
  43. echo "call faild, errorCode:$error\n";
  44. curl_close($ch);
  45. return false;
  46. }
  47. }
  48.  
  49. //$money
  50. function sendMoney($money,$openid,$uid)
  51. {
  52.  
  53. $money=$money;
  54. $mch_id="123456777";//商户ID
  55. $nonce_str=date("YmdHis").rand(9999,189900);
  56. $mch_billno=date("YmdHis").rand(1000,9999);
  57. //date("Ymd").rand(10000000,9999999999);
  58. $wxappid="sx4324rererer3434";//appid
  59. $nick_name="test";
  60. $send_name="test";
  61. $re_openid=$openid;
  62. $total_amount=$money;//$total_amount、$min_value、$max_value一致
  63. $min_value=$money;
  64. $max_value=$money;
  65. $total_num="1";//红包个数
  66. $wishing="test";
  67. $client_ip="xxx.xx.xxx.xx";//服务器IP地址
  68. $act_name="佣金";
  69. $remark="恭喜您获得红包,再接再励哦!";
  70. $stringA="act_name=$act_name&client_ip=$client_ip&max_value=$max_value&mch_billno=$mch_billno&mch_id=$mch_id&min_value=$min_value&nick_name=$nick_name&nonce_str=$nonce_str&re_openid=$re_openid&remark=$remark&send_name=$send_name&total_amount=$total_amount&total_num=$total_num&wishing=$wishing&wxappid=$wxappid";
  71. //注意这个stringA 花在这上面不少时间,没仔细看官方的信息,一直报签名错误,这个参数列表要按照参数名ASCII码从小到大排序,参数跟下面构建的xml数据一样
  72. //建议从这里生成在放到这里特别是多个参数名称类似http://mch.weixin.qq.com/wiki/tools/signverify/
  73.  
  74. $stringSignTemp="$stringA&key=e10adcaba59abbe56e057120fa3esxCX";
  75. $sign=strtoupper(md5($stringSignTemp));
  76. $data="<xml>
  77. <nonce_str>$nonce_str</nonce_str>
  78. <sign>$sign</sign>
  79. <mch_billno>$mch_billno</mch_billno>
  80. <mch_id>$mch_id</mch_id>
  81. <wxappid>$wxappid</wxappid>
  82. <nick_name>$nick_name</nick_name>
  83. <send_name>$send_name</send_name>
  84. <re_openid>$re_openid</re_openid>
  85. <total_amount>$total_amount</total_amount>
  86. <min_value>$min_value</min_value>
  87. <max_value>$max_value</max_value>
  88. <total_num>$total_num</total_num>
  89. <wishing>$wishing</wishing>
  90. <client_ip>$client_ip</client_ip>
  91. <act_name>$act_name</act_name>
  92. <remark>$remark</remark>
  93. </xml>";
  94. $data1 = curl_post_ssl('https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack',$data);
  95. $xml=simplexml_load_string($data1);
  96. if( $xml!="")
  97. {
  98. $ss=$xml->children();
  99. if($ss=="SUCCESS")
  100. {
  101. //执行自定义代码
  102. return true;
  103. }
  104. else
  105. return false;
  106. }
  107. return false;
  108. }

微信开发小结-PHP的更多相关文章

  1. iOS版微信开发小结(微信支付,APP跳转微信公众号)

    最近公司心血来潮,一心要搞微信.废话不多说,直接上干货. 开发前准备: 1.在微信开发者平台获取开发者认证:(一年300元人民币) PS:具体流程按照微信流程指示操作即可,在这就不废话了. 2.下载微 ...

  2. 微信开发】【Asp.net MVC】-- 微信分享功能

    [微信开发][Asp.net MVC]-- 微信分享功能 2017-01-15 09:09 by stoneniqiu, 12886 阅读, 15 评论, 收藏, 编辑 内嵌在微信中的网页,右上角都会 ...

  3. vue开发小结(下)

    前言 继前几天总结了vue开发小结(上)后,发现还有很多的点没有能列举出来,于是还是打算新建一个下篇,再补充一些vue开发中需要注意的细节,确实还是都是细节的问题,我只是在这里强调下,希望对大家有帮助 ...

  4. h5 录音 自动生成proto Js语句 UglifyJS-- 对你的js做了什么 【原码笔记】-- protobuf.js 与 Long.js 【微信开发】-- 发送模板消息 能编程与会编程 vue2入坑随记(二) -- 自定义动态组件 微信上传图片

    得益于前辈的分享,做了一个h5录音的demo.效果图如下: 点击开始录音会先弹出确认框: 首次确认允许后,再次录音不需要再确认,但如果用户点击禁止,则无法录音: 点击发送 将录音内容发送到对话框中.点 ...

  5. pdfjs viewer 开发小结

    此文已由作者吴家联授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1. pdfjs库简介 PDF.js 是由Mozilla 主导推出的可以将PDF文件转换为H5页面进行展示的 ...

  6. Android 即时通讯开发小结(二)

    <Android 即时通讯开发小结>基于IM Andriod 开发的各种常见问题,结合网易云信即时通讯技术的实践,对IM 开发做一个全面的总结. 相关推荐阅读:. Android 即时通讯 ...

  7. Android 即时通讯开发小结(一)

    <Android 即时通讯开发小结>基于IM Andriod 开发的各种常见问题,结合网易云信即时通讯技术的实践,对IM 开发做一个全面的总结. 相关推荐阅读:. Android 即时通讯 ...

  8. 【微信开发】公众号后台设置错误导致的微信redirect_uri参数错误【图】

    在微信开发中,如微信网页授权登录,分享到朋友圈自定义内容,微信h5支付时 可能会遇到微信redirect_uri参数错误的情况. 此时除了检查自己代码正确性外,还要检查一下是否正确地设置了公众号后台的 ...

  9. 《C#微信开发系列(Top)-微信开发完整学习路线》

    年前就答应要将微信开发的学习路线整理给到大家,但是因为年后回来这段时间学校还有公司那边有很多事情需要兼顾,所以没能及时更新文章.今天特地花时间整理了下,话不多说,上图,希望对大家的学习有所帮助哈. 如 ...

随机推荐

  1. Unity3D之Assetbundle

    原地址: Unity3D之Assetbundle 有几个地方需要注意下 1.如何解决资源重复加载的问题 2.初始化了就直接出现在场景中了  感觉怪怪的 3.标红的地方要注意下  prefab上挂载的脚 ...

  2. C#&Java重学笔记(集合比较和转换)

    C#部分: 1.C#中集合有三种,数组类,ArrayList,和字典键值对类,一般也可以自定义集合,但是自定义集合的类型也只有这三类. 2.自定义集合实现三类集合的方法:前两者需要继承Collecti ...

  3. Android的事件处理机制(一)------基于回调机制的事件处理

    Android平台的事件处理机制有两种,一种是基于回调机制的,一种是基于监听接口的,现介绍第一种:基于回调机制的事件处理.Android平台中,每个View都有自己的处理事件的回调方法,开发人员可以通 ...

  4. Jquery 中map和each的区别

    <script type="text/javascript"> $(function () { var json = {"Name":"L ...

  5. 离开csdn来到blog园

    csdn里没有限制阅读访问的功能,所以我选择来到cnblog 但是不得不说,cnblog做的界面很丑,我个人很不喜欢,但是没办法

  6. 深入剖析阿里巴巴云梯YARN集群

    我的一篇文章<深入剖析阿里巴巴云梯YARN集群> 已经发表在程序员2013年11月刊中, 原文链接为http://www.csdn.net/article/2013-12-04/28177 ...

  7. hadoop 2.0 native

    1.安装protobuf,参照http://wiki.apache.org/hadoop/HowToContribute 安装java模块 在java目录mvn install 2.配置protobu ...

  8. WAS集群服务的关闭与启动

    WAS集群服务的关闭与启动 欢迎转载,转载时请务必注明出处(http://blog.csdn.net/huangyanlong),否则作者保留追究版权法律责任. 表述有错误之处,请您留言或邮件(hyl ...

  9. 关于strlen

    strlen的实现是通过4个字节4个字节进行枚举,然后通过位运算来判断这4个字节中是否有一个字节含有0,这样的话,效率就提高了4倍. 这个效率提高是假设a&b&c&d与a&am ...

  10. POJ1019——Number Sequence(大数处理)

    Number Sequence DescriptionA single positive integer i is given. Write a program to find the digit l ...