2016封裝的微信支付,太好用了
一直在做微信,遇到過很多坑,今天寫出來,讓大家少走點彎路,第一次寫文字,有點土,如果有不懂的童鞋,可以聯絡我QQ1034100429,或者發私訊。
getaccesstoken 取得access_token
//啟動付款
public function sendpay($openid, $title, $out_trade_no, $total_fee, $notify_url)
sendtpl 發送範本訊息<?php <br />
/**<br>
* 由 PhpStorm 建立。 <br>
* 使用者:管理員<br>
* 日期:2016/4/11<br>
*時間:22:43<br>
*/<br>
namespace Org;<br>
class Weixin<br>
{<br>
private $appid; //微信公號的appid<br>
private $appsecret; //微信公眾號碼的appsecret<br>
private $mchid; //微信公眾號的商家號碼<br>
private $wechatkey; //微信公號的付款金鑰<br>
private $token;<br>
public function __construct()<br>
{<br>
$this->appid = C('WEIXIN_APPID');<br>
$this->appsecret = C("WEIXIN_APP_SECRET");<br>
$this->mchid = C("WEIXIN_MCHID");<br>
$this->wechatkey = C("WEIXIN_KEY");<br>
$this->token = C('WEIXIN_APP_TOKEN');<br>
<br>
}<br>
public function chushi()<br>
{<br>
echo $this->getaccesstoken();<br>
}<br>
public function checkSignature()<br>
{<br>
$signature = $_GET['signature'];<br>
$timestamp = $_GET['timestamp'];<br>
$nonce = $_GET['nonce'];<br>
$token = $this->token;<br>
$arrtemp = array($token, $timestamp, $nonce);<br>
sort($arrtemp, SORT_STRING);<br>
$arrtemp = implode($arrtemp);<br>
$arrtemp = sha1($arrtemp);<br>
if ($arrtemp == $signature) {<br>
return true;<br>
} else {<br>
return false;<br>
}<br>
}<br>
public function valid()<br>
{<br>
$echoStr = $_GET['echostr'];<br>
if ($this->checkSignature()) {<br>
echo $echoStr;<br>
exit;<br>
}<br>
}<br>
////根據回傳的資訊,做出對應的處理<br>
// public function responseMsg()<br>
// {<br>
// $postStr = file_get_contents('php://input');<br>
// if (!empty($postStr)){<br>
// /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,<br>
// the best way is to check the validity of xml by yourself */<br>
// libxml_disable_entity_loader(true);<br>
// $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);<br>// $fromUsername = $postObj->FromUserName;<br>
// $toUsername = $postObj->ToUserName;<br>
// $keyword = trim($postObj->Content);<br>
// $msgType = $postObj->MsgType;<br>
// $Event=$postObj->Event;<br>
// $time = time();<br>
// $textTpl = "<xml><br>
// <tousername></tousername><br>
// <fromusername></fromusername><br>
// <createtime>%s</createtime><br>
// <msgtype></msgtype><br>
// 內容><br>
// <funcflag>0</funcflag><br>
// </xml>」且;<br>
// if(!empty( $keyword ))<br>
// {<br>
// $msgType = "text";<br>
// $contentStr =「歡迎來到微信世界!」;<br>
// $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);<br>
// echo $resultStr;<br>
// }其他{<br>
// echo 「輸入上一些內容...」;<br>
// }<br>
//<br>
// }否則{<br>
// echo "";<br>
// 退出;<br>
// }<br>
// }<br>
公用函數 getaccesstoken()<br>
{<br>
$access_token = S('access_token');<br>
if(!empty($access_token)){<br>
<br>
返回 $access_token;<br>
}其他{<br>
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $this->appid。 “&秘密=”。
$ret = $this->curlget($url);<br> $ret = json_decode($ret,true);<br>
S('access_token',$ret['access_token'],7100);<br>
<br>
返回 $ret['access_token'];<br>
}<br>
}<br>
//依照openid拉取使用者資訊<br>
公用函數使用者資訊($openid){<br>
$access_token = $this->getaccesstoken();<br>
$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$access_token."&openid=".$openid."&lang=zh_CN";<br>
$userinfo = json_decode($this->curlget($url),true);<br>
回 $userinfo;<br>
}<br>
函數 p($arr){<br>
echo "<meta>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">";<br>
print_r($arr);<br>
}<br>
函數curlget($url)<br>
{<br>
$ch = curl_init();<br>
curl_setopt($ch, CURLOPT_URL, $url);<br>
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);<br>
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);<br>
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br>
curl_setopt($ch, CURLOPT_HEADER, 0);<br>
$輸出= curl_exec($ch);<br>
curl_close($ch);<br>
則為$輸出;<br>
}<br>
公用函數 jingmo($url,$code,$state){<br>
如果($代碼){<br>
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->appid."&secret=".$this->appsecret."&code=". $code ."&grant_type=authorization_code";<br>
$arrtemp = json_decode($this->curlget($url),true);<br>
$ret = $this->getuserinfo($arrtemp['openid'],$arrtemp['access_token']);<br>
則返回 $ret;<br>
}其他{<br>
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$this->appid."&redirect_uri=".$url."&response_type=code&scope=snsapi_userinfo&state=". $ state."#wechat_redirect";<br>
header("位置:$url");<br>
}<br>
}<br>
公用函數 getuserinfo($openid,$user_access_token){<br>
$userurl = "https://api.weixin.qq.com/sns/userinfo?access_token=".$user_access_token."&openid=".$openid."&lang=zh_CN";<br>
$userinfo = json_decode($this->curlget($userurl),true);<br>
回 $userinfo;<br>
}<br>
公用函數 getjsapi_ticket(){<br>
$js_ticket = S("js_ticket");<br>
if(!empty($js_ticket)){<br>
返回 $js_ticket;<br>
}其他{<br> $access_token = $this->getaccesstoken();<br>
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi";<br>
$res = json_decode($this->curlget($url),true);<br>
S("js_ticket",$res['ticket'],7100);<br>
則返回 $res['ticket'];<br>
}<br>
}<br>
公用函數 getjssign(){<br>
echo "<meta>";<br>
$js_ticket = $this->getjsapi_ticket();<br>
$時間 = 時間();<br>
$arr = 陣列(<br>
'noncestr'=>md5($time),<br>
'jsapi_ticket'=>$js_ticket,<br>
'時間戳記'=>$時間,<br>
'url'=>'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'],<br>
<br>
);<br>
$this->p($arr);<br>
ksort($arr);<br>
$string="";<br>
$i=1;<br>
foreach($arr as $key=>$val){<br>
如果($i==1){<br>
$string.=$key."=".$val;<br>
}其他{<br>
$string.="&".$key."=".$val;<br>
}<br>
$i++;<br>
迴聲 $i;<br>
}<br>
// 回顯 $string;<br>
$signature=strtolower($string);<br>
$signature = sha1($string);<br>
$jsconfig=陣列(<br>
'調試'=>true,<br>
'appId'=>$this->appid,<br>
'時間戳記'=>$時間,<br>
'nonceStr'=>md5($time),<br>
'已簽名'=>$簽署,<br>
' jsApiList'=>"['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ']",<br>
);<br>
$json=json_encode($jsconfig);<br>
返回 $json;<br>
}<br>
//產生大寫簽章<br>
函數 createsign($arr,$biaozhi){<br>
ksort($arr);<br>
$string="";<br>
$i=1;<br>
foreach($arr as $key=>$val){<br>
如果($i==1){<br> $string.=$key."=".$val;<br>
}其他{<br>
$string.="&".$key."=".$val;<br>
}<br>
$i++;<br>
}<br>
$signtemp=「$string&key=」。 $this->wechatkey;<br>
$sign = strtoupper(MD5($signtemp));<br>
$arr[$biaozhi] = $sign;<br>
//$json=json_encode($arr);<br>
返回 $arr;<br>
}<br>
//付款<br>
<br>
//啟動付款<br>
公用函數 sendpay($openid, $title, $out_trade_no, $total_fee, $notify_url)<br>
{<br>
$時間 = 時間();<br>
$arr = 陣列(<br>
'appid'=> $this->appid,<br>
'mch_id'=>; $這個->mchid,<br>
'nonce_str'=>; md5($時間),<br>
'身體' => “kjhk”,<br>
'out_trade_no'=>; $out_trade_no,<br>
'total_fee' =>; $total_fee,<br>
'spbil_create_ip' =>; “127.0.0.1”,<br>
'notify_url' =>; $notify_url,<br>
'trade_type' =>; “JSAPI”,<br>
'openid' =>; $openid,<br>
);<br>
$biaozhi ='sign';<br>
$arr = $this->createsign($arr,$biaozhi);<br>
$xml = 「<xml>」;<br>
foreach($arr as $key=>$val){<br>
$xml.="".$val."".$key.">";<br>
}<br>
$xml.="</xml>";<br>
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";<br>
$resxml = $this->postCurlTransfer($url,$xml);<br>
$res = simplexml_load_string($resxml);<br>
$cutime = time();<br>
$jsapiarr=陣列(<br>
'appId'=>$this->appid,<br>
'timeStamp'=>"$cutime",<br>
'nonceStr'=>md5($cutime),<br>
'package'=>"prepay_id=".$res->prepay_id,<br>
'signType'=>"MD5",<br>
);<br> $biaozhi = 'paySign';<br>
$jsapi = $this->createsign($jsapiarr,$biaozhi);<br>
// $jsapijson = json_encode($jsapi);<br>
返回 $jsapi;<br>
}<br>
公用函數 getpaysign(){<br>
$時間 = 時間();<br>
$arr = 陣列(<br>
'appid'=>$this->appid,<br>
'mch_id'=>$this->mchid,<br>
'nonce_str'=>md5($time),<br>
'body'=>"sdf",<br>
'out_trade_no'=>"2016".$time,<br>
'total_fee'=>1,<br>
'spbill_create_ip'=>"127.0.0.1",<br>
'notify_url'=>"http://www.baidu.com",<br>
'trade_type'=>"JSAPI",<br>
);<br>
ksort($arr);<br>
$string="";<br>
$i=1;<br>
foreach($arr as $key=>$val){<br>
如果($i==1){<br>
$string.=$key."=".$val;<br>
}其他{<br>
$string.="&".$key."=".$val;<br>
}<br>
$i++;<br>
}<br>
$string.="&key=".$this->wechatkey;<br>
$sign = strtoupper(md5($string));<br>
$arr['sign'] = $sign;<br>
返回 $arr;<br>
}<br>
函數 Post($curlPost,$url){<br>
$curl=curl_init();<br>
curl_setopt($curl, CURLOPT_URL, $url);<br>
curl_setopt($curl, CURLOPT_HEADER, false);<br>
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);<br>
curl_setopt($curl, CURLOPT_NOBODY, true);<br>
curl_setopt($curl, CURLOPT_POST, true);<br>
curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);<br>
$return_str = curl_exec($curl);<br>
curl_close($curl);<br>
返回 $return_str;<br>
}<br>
私有函數 postCurlTransfer($url, $data)<br>
{<br>
$curl=curl_init();<br>
curl_setopt($curl, CURLOPT_URL, $url);<br>
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);<br>
curl_setopt($curl, CURLOPT_POST, 1);<br>
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);<br> $str = curl_exec($curl);<br>
curl_close($curl);<br>
<br>
return $str;<br>
}<br>
//傳送範本訊息<br>
public function sendtpl($openid, $url, $template_id, $content, $topcolor="#FF0000")<br>
{<br>
$arr = array(<br>
'touser' => $openid,<br>
'template_id' => $template_id,<br>
'url' => $url,<br>
'topcolor' => $topcolor,<br>
'data' => $content,<br>
);<br>
$arrjson = json_encode($arr);<br>
$accesstoken = $this->getAccessToken();<br>
$sendurl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$accesstoken;<br>
return $this->postCurlTransfer($sendurl, $arrjson);<br>
}<br>
}</pre><div class="contentsignin">登入後複製</div></div>
上面的是微信支付簡單封裝
若發起支付,請先對應微信公眾號的資料。
包括微信支付目錄
我這裡是
http://網域//index.php/Home/Index/
好像是這個
取得access_token的過程<?php <br />
/**<br>
* 由 PhpStorm 建立。 <br>
* 用戶:sks<br>
* 日期:16/7/8<br>
* 時間:下午3:54<br>
*/<br>
namespace HomeController;<br>
use CommonControllerHomebaseController;<br>
Class WeixinController extends HomebaseController{<br>
public function zhanshi(){<br>
$weixin = new OrgWeixin;<br>
$code = $_GET['code'];<br>
$state = $_GET['state'];<br>
$url="";<br>
$userinfo = $weixin->jingmo($url, $code, $state);<br>
session('userinfo',$userinfo);<br>
if($code) {<br>
header("Location: $state");<br>
}else{<br>
}<br>
}<br>
}
公用函數
function.phpfunction getuserinfo(){ //取得使用者資訊<br>
import("weixin");<br>
$weixin = new OrgWeixin;<br>
$info = session('userinfo');<br>
if($info){<br>
return $info;<br>
die;<br>
}else {<br>
$state = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];<br>
$code = '';<br>
$url = 'http://' . $_SERVER['HTTP_HOST'] . U('Home/Weixin/zhanshi');<br>
$url = urlencode($url);<br>
$weixin->jingmo($url, $code, $state);<br>
}<br>
}
測試支付<?php <br />
/**<br>
* Created by PhpStorm.<br>
* User: sks<br>
* Date: 16/7/8<br> * Time: 下午3:29<br>
*/<br>
namespace HomeController;<br>
use CommonControllerHomebaseController;<br>
use ThinkPage;<br>
Class IndexController extends HomebaseController{<br>
<br>
//測試支付<br>
public function zhifu()<br>
{<br>
$userinfo = getuserinfo(); //取得微信使用者資訊以呼叫公用函數<br>
$openid = $userinfo['openid'];<br>
$time = time();<br>
$title = "我支付";<br>
$out_trade_no = date('Y',time()).$time.rand(1000,2000);<br>
$total_fee = 1;<br>
$notify_url = "http://網域/index.php/Home/Index/paynotify";//回呼網址<br>
$weixin = new OrgWeixin;<br>
$result = $weixin->sendpay($openid, $title, $out_trade_no, $total_fee, $notify_url);<br>
$this->assign('result',$result);<br>
$this->display();<br>
}<br>
//這裡是付款結果通知<br>
public function paynotify(){<br>
$weixin = new OrgWeixin;<br>
$xml = file_get_contents("php://input");<br>
$p = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);<br>
$arr = $this->object_array($p);<br>
$out_trade_no = $arr['out_trade_no'];<br>
$transaction_id= $arr['transaction_id'];<br>
$openid = $arr['openid'];<br>
$sign = $arr['sign'];<br>
//處理支付結果<br>
unset($arr['sign']);<br>
$biaozhi = "sign";<br>
$ret = $weixin->createsign($arr, $biaozhi);<br>
if($ret['sign'] === $sign) {<br>
$aa = "成功";<br>
} else {<br>
$aa = "失敗";<br>
}<br>
$file = './logweixin.txt';//要寫入檔案的檔案名稱(可以是任一檔案名稱),若檔案不存在,將會建立一個<br>
$content = $out_trade_no."***".$transaction_id."第一次寫入的內容n";<br>
if($f = file_put_contents($file, $content,FILE_APPEND)){// 這個函數支援版本(PHP 5)<br>
echo "寫入成功。<br>";<br>
}<br>
//這裡處理付款結果的過程<br>
echo "success";<br>
}<br>
<br>
public function getaccesstoken(){<br>
$weixin = new OrgWeixin;<br>
echo $weixin->getaccesstoken();<br>
<br>
}<br>
}

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

了解Python程式設計的入門程式碼範例Python是一種簡單易學,功能強大的程式語言。對於初學者來說,了解Python程式設計的入門級程式碼範例是非常重要的。本文將為您提供一些具體的程式碼範例,幫助您快速入門。列印HelloWorldprint("HelloWorld")這是Python中最簡單的程式碼範例。 print()函數用於將指定的內容輸出

《Go語言程式設計實例:Web開發中的程式碼範例》隨著網路的快速發展,Web開發已成為各行業中不可或缺的一部分。作為一門功能強大且效能優越的程式語言,Go語言在Web開發中越來越受到開發者們的青睞。本文將透過具體的程式碼範例,介紹如何利用Go語言進行Web開發,讓讀者更能理解並運用Go語言來建立自己的Web應用。 1.簡單的HTTP伺服器首先,讓我們從一個

PHP變數儲存程式運行期間的值,對於建立動態且互動的WEB應用程式至關重要。本文將深入探討php變量,並透過10個真實的範例展示它們的實際應用。 1.儲存使用者輸入$username=$_POST["username"];$passWord=$_POST["password"];此範例從表單提交中提取使用者名稱和密碼,並將其儲存在變數中以供進一步處理。 2.設定配置值$database_host="localhost";$database_username="username";$database_pa

Java冒泡排序最簡單的程式碼範例冒泡排序是一種常見的排序演算法,它的基本想法是透過相鄰元素的比較和交換來將待排序序列逐步調整為有序序列。以下是一個簡單的Java程式碼範例,示範如何實作冒泡排序:publicclassBubbleSort{publicstaticvoidbubbleSort(int[]arr){int

標題:從入門到精通:Go語言中常用資料結構的程式碼實作資料結構在程式設計中起著至關重要的作用,它是程式設計的基礎。在Go語言中,有許多常用的資料結構,掌握這些資料結構的實作方式對於成為優秀的程式設計師至關重要。本文將介紹Go語言中常用的資料結構,並給出對應的程式碼範例,幫助讀者從入門到精通這些資料結構。 1.數組(Array)數組是一種基本的資料結構,是一組相同類型

華為雲端邊緣運算對接指南:Java程式碼範例快速實現介面隨著物聯網技術的快速發展和邊緣運算的興起,越來越多的企業開始關注邊緣運算的應用。華為雲端提供了邊緣運算服務,為企業提供了高可靠的運算資源和便利的開發環境,使得邊緣運算應用更容易實現。本文將介紹如何透過Java程式碼快速實現華為雲端邊緣運算的介面。首先,我們需要準備好開發環境。確保你已經安裝了Java開發工具包(

如何使用PHP編寫庫存管理系統中的庫存分倉管理功能碼庫存管理是許多企業中不可或缺的一部分。對於擁有多個倉庫的企業來說,庫存分倉管理功能尤其重要。透過合理管理和追蹤庫存,企業可以實現不同倉庫之間的庫存調撥,優化營運成本,改善協同效率。本文將介紹如何使用PHP編寫庫存分倉管理功能的程式碼,並為您提供相關的程式碼範例。一、建立資料庫在開始編寫庫存分倉管理功能的程式碼之

Java選擇排序法程式碼編寫指南及範例選擇排序是一種簡單直觀的排序演算法,其想法是每次從未排序的元素中選擇最小(或最大)的元素進行交換,直到所有元素排序完成。本文將提供選擇排序的程式碼編寫指南,並附上具體的Java範例程式碼。演算法原理選擇排序的基本原理是將待排序數組分為已排序和未排序兩部分,每次從未排序部分選擇最小(或最大)的元素,將其放到已排序部分的末尾。重複上述
