功能點:php
一、 網頁受權得到微信用戶信息json
用戶在微信客戶端中訪問第三方網頁,公衆號能夠經過微信網頁受權機制,來獲取用戶基本信息,進而實現業務邏輯。api
注意點:Scope爲snsapi_base 只能得到用戶的openid,爲snsapi_userinfo(會跳出一個受權頁面)時能夠得到openid,nicknam,sex,province等詳見接口文檔。服務器
應用場景:第一次須要受權,後面無需受權。微信
解決方案,第一次爲snsapi_userinfo,保存信息,非第一次去檢查這個openid是否已存在 若是不存在 跳轉至snsapi_userinfo的頁面受權,不然就直接從讀取信息。app
二、 分享接口curl
該接口較簡單,引入js,按照官方文檔說明就行函數
三、 微信支付post
開通微信支付功能,下載官方的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);
四、 後臺自動發送紅包接口
構建發送信息,紅包金額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\n"; 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; }