zoukankan      html  css  js  c++  java
  • 微信开发小结-PHP

    功能点:

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

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

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

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

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

    2、  分享接口

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

    3、  微信支付

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

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

     回调

    <?php
    
    require_once "lib/WxPay.Api.php";
    require_once 'lib/WxPay.Notify.php';
    require_once 'unit/log.php';
    
    //初始化日志
    $logHandler= new CLogFileHandler("./logs/".date('Y-m-d').'.log');
    $log = Log::Init($logHandler, 15);
    
    class PayNotifyCallBack extends WxPayNotify
    {
        //查询订单
        public function Queryorder($transaction_id)
        {
            $input = new WxPayOrderQuery();
            $input->SetTransaction_id($transaction_id);
            $result = WxPayApi::orderQuery($input);
            Log::DEBUG("query:" . json_encode($result));
            if(array_key_exists("return_code", $result)
                && array_key_exists("result_code", $result)
                && $result["return_code"] == "SUCCESS"
                && $result["result_code"] == "SUCCESS")
            {
                return true;
            }
            return false;
        }
        
        //重写回调处理函数
        public function NotifyProcess($data, &$msg)
        {
        
            Log::DEBUG("call back:" . json_encode($data));
            $notfiyOutput = array();
            
            if(!array_key_exists("transaction_id", $data)){
                $msg = "输入参数不正确";
                return false;
            }
            //查询订单,判断订单真实性
            if(!$this->Queryorder($data["transaction_id"])){
                $msg = "订单查询失败";
                return false;
            }
            //根据 $data["out_trade_no"]  订单号 更新订单状态
            //执行更新
        
            return true;
        }
    }
    
    Log::DEBUG("begin notify");
    $notify = new PayNotifyCallBack();
    $notify->Handle(false);

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

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

    function curl_post_ssl($url, $vars, $second=30,$aHeader=array())
    {
        $ch = curl_init();
        
        curl_setopt($ch,CURLOPT_TIMEOUT,$second);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
            
        //curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
        //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
        
        
        //curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
        //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/cert.pem');
        
            curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
        curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/cert/rootca.pem');
        curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
        curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/cert/apiclient_cert.pem');
    
        curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
        curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/cert/apiclient_key.pem');
        
        
        //curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
        //curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/private.pem');
        
        
        //curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');
     
        if( count($aHeader) >= 1 ){
            curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
        }
     
        curl_setopt($ch,CURLOPT_POST, 1);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
        $data = curl_exec($ch);
        if($data){
            curl_close($ch);
            return $data;
        }
        else { 
            $error = curl_errno($ch);
            echo "call faild, errorCode:$error
    "; 
            curl_close($ch);
            return false;
        }
    }
    
    
    
    
    
    
    //$money
    function sendMoney($money,$openid,$uid)
    {
    
    $money=$money;
    $mch_id="123456777";//商户ID
    $nonce_str=date("YmdHis").rand(9999,189900);
    $mch_billno=date("YmdHis").rand(1000,9999);
    //date("Ymd").rand(10000000,9999999999);
    $wxappid="sx4324rererer3434";//appid
    $nick_name="test";
    $send_name="test";
    $re_openid=$openid;
    $total_amount=$money;//$total_amount、$min_value、$max_value一致
    $min_value=$money;
    $max_value=$money;
    $total_num="1";//红包个数
    $wishing="test";
    $client_ip="xxx.xx.xxx.xx";//服务器IP地址
    $act_name="佣金";
    $remark="恭喜您获得红包,再接再励哦!";
    $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";
    //注意这个stringA 花在这上面不少时间,没仔细看官方的信息,一直报签名错误,这个参数列表要按照参数名ASCII码从小到大排序,参数跟下面构建的xml数据一样
    //建议从这里生成在放到这里特别是多个参数名称类似http://mch.weixin.qq.com/wiki/tools/signverify/
    
    $stringSignTemp="$stringA&key=e10adcaba59abbe56e057120fa3esxCX";
    $sign=strtoupper(md5($stringSignTemp));
    $data="<xml>
                <nonce_str>$nonce_str</nonce_str>
                <sign>$sign</sign>
                <mch_billno>$mch_billno</mch_billno>
                <mch_id>$mch_id</mch_id>
                <wxappid>$wxappid</wxappid>
                <nick_name>$nick_name</nick_name>
                <send_name>$send_name</send_name>
                <re_openid>$re_openid</re_openid>
                <total_amount>$total_amount</total_amount>
                <min_value>$min_value</min_value>
                <max_value>$max_value</max_value>
                <total_num>$total_num</total_num>
                <wishing>$wishing</wishing>
                <client_ip>$client_ip</client_ip>
                <act_name>$act_name</act_name>
                <remark>$remark</remark> 
            </xml>";
      $data1 = curl_post_ssl('https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack',$data);
      $xml=simplexml_load_string($data1);
      if( $xml!="")
      {
    $ss=$xml->children();
      if($ss=="SUCCESS")
      { 
    //执行自定义代码
      return true;
      }
      else
      return false;
      }
      return false;
    }
  • 相关阅读:
    tcp/ip 调优示例
    【ASP.NET】IHttpHandler和IHttpModule
    【.NET框架】Dapper ORM 用法—Net下无敌的ORM
    【JavaScript】setinterval和setTimeout的区别
    【javascript】基于javascript的小时钟
    【ASP.NET】必须知道的ASP.NET核心处理
    【ASP.NET MVC】 路由机制:命名路由
    【ASP.NET MVC】提高页面加载速度:脚本优化
    SMTP协议--在cmd下利用命令行发送邮件
    【ASP.NET MVC】HTML5+MVC上传文件显示进度
  • 原文地址:https://www.cnblogs.com/zhangqifeng/p/4516433.html
Copyright © 2011-2022 走看看