php微信支付教程
1. 微信支付php sdk怎麼使用
它裡面集成了微信支付的很多功能函數。
你只需要直接調用這個介面即可,
如果能看的明白代碼,你也可以自己根據自己的喜歡封裝成類。
具體的用法只能去找api文檔。
2. 如何用php開發微信支付介面
appid //公眾號後台開發者中心獲得(和郵件內的一樣) mchid//郵件內獲得 key//商戶後台自己設置 appsecret //公眾號開發者中心獲得
兩個證書文件,郵件內獲得 apiclient_cert.pem apiclient_key.pem
注意事項:
公眾號後台微信支付-》開發配置-》新增測試目錄和測試個人微信號。
開發者中心-》網頁授權獲取用戶基本信息-》修改成你的測試域名。否則會出現redirect_uri 參數
3. PHP實現微信掃碼支付怎麼做,微信的demo報錯咋搞
微信掃碼首先你要確定幾個步驟:
1申請了微信支付,獲得到微信支付所需要的appid和秘鑰
2有正確的回調地址,就是需要外網ip地址接收回調信息
3如果以上都滿足,剩下來的才是代碼的問題,這個時候需要考慮比如版本問題,路徑問題,配置信息問題,各個可能得問題,然後開啟php的啊錯誤信息,對報錯問題具體分析。
4. php初學者如何學習實現微信支付和支付寶支付的相關
淘寶號綁定支付寶。 1、登陸淘寶官網,點擊注冊。 2、淘寶提供了兩種注冊方式:一般的會員注冊和手機注冊。 3、如果是已經注冊成功的淘寶號,點擊「我的淘寶」。 4這時,在新出現的頁面中選擇:設置——支付寶綁定設置。
5. 你好 !! PHP如何實現微信支付 求指教 新手!說清楚一點
通知機制的實現,官方只有文檔沒有demo代碼,對沒搞過的人來說,需要花大量時間來做測試。
從文檔上說的來看,微信每次通知過來的數據,結構比較復雜,是一個多段數據,除了要取出POST數據外,還要取其它的數據。
這里首先涉及到一個關於php://input與$_POST取值的問題,簡單列幾點如下:
1,Content- Type取值為application/x-www-form-urlencoded時,php會將http請求body相應數據會填入到數組$_POST,填入到$_POST數組中的數據是進行urldecode()解析的結果。(其實,除了該Content-Type,還有 multipart/form-data表示數據是表單數據,稍後我們介紹)
2,php://input數據,只要Content-Type不為 multipart/form-data(該條件限制稍後會介紹)。那麼php://input數據與http entity body部分數據是一致的。該部分相一致的數據的長度由Content-Length指定。
3,僅當Content-Type為application/x-www-form-urlencoded且提交方法是POST方法時,$_POST數據與php://input數據才是」一致」(打上引號,表示它們格式不一致,內容一致)的。其它情況,它們都不一致。
4,php://input讀取不到$_GET數據。是因為$_GET數據作為query_path寫在http請求頭部(header)的PATH欄位,而不是寫在http請求的body部分。
幫助我們了解了為什麼xml_rpc服務端讀取數據都是通過file_get_contents(『php://input', 『r')。
而不是從$_POST中讀取,正是因為xml_rpc數據規格是xml,它的Content-Type是text/xml。
5. php://input碰到了multipart/form-data,請查閱RFC1867對它的描述。multipart/form-data也表示以POST方法提交表單數據,它還伴隨了文件上傳,所以會跟application/x- www-form-urlencoded數據格式不一樣。它會以一更種更合理的,更高效的數據格式傳遞給服務端。當Content-Type為multipart/form-data的時候,即便http請求body中存在數據,php://input也為空,PHP此時,不會把數據填入php://input流。所以,可以確定: php://input不能用於讀取enctype=multipart/form-data數據。
6. 當Content-Type為application/x- www-form-urlencoded時,php://input和$_POST數據是「一致」的,為其它Content-Type的時候,php: //input和$_POST數據數據是不一致的。因為只有在Content-Type為application/x-www-form- urlencoded或者為multipart/form-data的時候,PHP才會將http請求數據包中的body相應部分數據填入$_POST全局變數中,其它情況PHP都忽略。而php://input除了在數據類型為multipart/form-data之外為空外,其它情況都可能不為空
以上轉述這么多文字的意思,就是說,得用到這兩種方式來讀取微信傳過來的數據。 ..
6. 微信支付lavel是什麼
Laravel 微信開發組件-WeChat 微信支付
一、介紹
本教程是LAMP開發環境下基於larvel5.1LTS版進行的開發實例。
由於現在國內有很多優秀且具備開源精神的php開發者,因此出於節約時間成本和維護成本的考慮,微信開發採用組件化開發,我們沒必要重復造輪子。本教程採用 overtrue 團隊的 easywechat 組件進行微信的支付功能開發和實現。
由於這個組件功能過多 本篇博客主要介紹「掃碼支付」的主要流程和思路。
二、composer安裝
默認大家已經在自己的開發環境上已經安裝了composer,並會一些簡單的操作,安裝命令:
composer require "overtrue/laravel-wechat:~3.0"
* 如果你用了 laravel-debugbar,請禁用或者關掉,否則這模塊別想正常使用!!! * (但是composer提示是否可以關閉x-debug,會影響安裝之類的提示,可以不去管它)
三、在laravel中進行配置
1.注冊 ServiceProvider (找到 config/app.php 配置文件中,key為 providers 的數組,在數組中添加服務提供者):
Overtrue\LaravelWechat\ServiceProvider::class,
2.(可選)添加 * 外觀 * 在app/config/app.php 的 aliases 數組里,添加 * 別名 * :
'wechat' =>Overtrue\LaravelWechat\ServiceProvider::class,
3.創建配置文件(在項目根目錄中運行 artisan 命令,發布配置文件到你的項目中):
php artisan vendor:publish
此時在/config目錄下會生成配置文件wechat.php,在裡面輸入你的微信商家信息,這里請注意保護隱私。
四、 微信支付飛起
1.配置微信商家信息,laravel根目錄下的.ENV文件支持以下配置:
WECHAT_APPID
WECHAT_SECRET
WECHAT_TOKEN
WECHAT_AES_KEY
WECHAT_LOG_LEVEL
WECHAT_LOG_FILE
WECHAT_OAUTH_SCOPES
WECHAT_OAUTH_CALLBACK
WECHAT_PAYMENT_MERCHANT_ID
WECHAT_PAYMENT_KEY
WECHAT_PAYMENT_CERT_PATH
WECHAT_PAYMENT_KEY_PATH
WECHAT_PAYMENT_DEVICE_INFO
WECHAT_PAYMENT_SUB_APP_ID
WECHAT_PAYMENT_SUB_MERCHANT_ID
WECHAT_ENABLE_MOCK
你可以在/config/wechat.php中進行相關參數配置,也可以寫在.ENV文件中,然後,wechat.php具體讀取方法:
'notify_url' => env('NOTIFY_URL', 'http://www.XXXXX.com/notify_url'), // 回調地址
env()默認讀取.env文件中常量的值,如果.env中沒有定義該常量,則返回env()的第二個參數的值。
2.wechat.php文件中需要注意的地方
(1).'log'數組內是日誌配置。
(2).'payment'數組是主要配置的數組,主要配置商戶的信息和證書。
3.(重點)創建訂單
(1).引入命名空間
use EasyWeChat\Foundation\Application;
use EasyWeChat\Payment\Order;
(2).填寫訂單信息
$attributes = [
'trade_type' => 'JSAPI', // JSAPI,NATIVE,APP...
'body' => 'iPad mini 16G 白色',
'detail' => 'iPad mini 16G 白色',
'out_trade_no' => '1217752501201407033233368018',
'total_fee' => 5388,
'notify_url' => 'http://xxx.com/order-notify', // 支付結果通知網址,如果不設置則會使用配置里的默認地址,我就沒有在這里配,因為在.env內已經配置了。
// ...
];
// 創建訂單
$order = new Order($attributes);
$result = $payment->prepare($order);
if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS')
{
//生產那個訂單後的邏輯
\Log::info('生成訂單號..'.$data->order_guid);
//這一塊是以ajax形式返回到頁面上。
//用戶的體驗就是點擊【確認支付】,驗證碼以彈層頁面出來了(沒錯,還需要一個好用的彈層js)。
$ajax_data=[
'html' => json_encode(\QrCode::size(250)->generate($result['code_url'])),
'out_trade_no' => $data->order_guid,
'price' => $data->price
];
return $ajax_data;
}else{
return back()->withErrors('生成訂單錯誤!');
}
五、渲染頁面
這里創建了訂單,需要生成二維碼圖片,可以參考一下這個二維碼圖片組件。
Composer 設置
首先,添加 QrCode 包添加到你的 composer.json 文件的 require 里:
composer require "simplesoftwareio/simple-qrcode"
添加 Service Provider
注冊 SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class 至 config/app.php 的 providers 數組里.
添加 Aliases
最後,注冊 'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class 至 config/app.php 的 aliases 數組里.
pay.blade.php內容
<script type="text/javascript" src="{{ asset('vendor/jquery.js') }}"></script>
<script type="text/javascript" src="{{ asset('layer/layer.js') }}"></script>
<input class="wechat_btn" type="button" value="確認支付"/>
{!-- 這個頁面需要有一些js代碼,才能使支付功能更加美觀可用無bug,比如ajax輪詢,點擊支付後的btn失效,放棄支付時關閉彈層等等 --}
js內容
$('.wechat_btn').click(function() {
$('.my_order_guid').val('');
$('#code').val('');
//ajax生成二維碼
data={
'_token':$(".token").val(),//令牌
'money':$(".money").val(),//商品價格
}
sendAjax(data, "/order", function (data) {
//發送二維碼過來(此處使用優美的layer彈層庫)
layer.open({
type: 1,
title:'微信支付',
skin: 'layui-layer-rim', //加上邊框
area: ['270px', '340px'], //寬高
content: "<p style='color:red;text-align: center;'>支付金額:"+data['price']
+"元</p> <input type='hidden' class='my_order_guid' value='"+data['out_trade_no']
+"'/><div id='code' style='text-align: center;'>"+JSON.parse(data['html'])+
"</div><p style='text-align: center;'>請使用微信掃碼支付</p><script> $('.layui-layer-close').click(function() { layer.msg('您已放棄本次支付');setTimeout('window.location.reload()',3000); });</script>"
//這里我把彈層庫有關的一點點js寫到content裡面去了。
});
getInfo();
//這里寫一個輪詢,可以非同步查詢訂單是否支付完成的信息,從而進行邏輯處理(比如輪詢支付狀態,成功了跳轉頁面),僅僅提點一下我的想法,輪詢的代碼不用找,沒有貼。
});
});
六、回調函數
先放上主要代碼再說:
public function notifyUrl(Request $request)
{
$app = new Application(config('wechat'));
$response = $app->payment->handleNotify(function($notify, $successful){
if ($successful) {
$order_arr=json_decode($notify,true);
$order_guid=$order_arr['out_trade_no'];//訂單號
//回調成功的邏輯
}
});
}
注意
(1).wechat發送回調是通過post方式,在路由處定義了之後,還需要在laravel項目中排除token驗證,我建議在中間件中VerifyCsrfToken.php進行排除路由。
protected $except = [
//
'/pay_success_notify',
'/To_rule_out_route'
];
(2). * 重點!重點!重點! * 回調這里的處理可以說是重中之重,這里出岔子,可能會造成 用戶支付成功後,微信的 * 回調沒有進來 * ,後台回調的邏輯就沒有執行,導致用戶錢花了,東西沒買上(即你的伺服器上沒有執行給付費用戶修改支付狀態等資料庫操作)。另一種後果,如果沒有正確返回微信參數,微信會多次發送回調信息來提醒你支付成功了,導致你的伺服器 * 接受回調函數多遍 * 。而此時你也馬馬虎虎,沒有在支付成功的邏輯上對用戶的支付狀態進行判斷,導致邏輯用戶充一次錢,在資料庫卻重復執行了好幾次相關資料庫操作。前者坑了付費用戶,後者坑了你的公司,這里如果不注意的話,後果只會很嚴重,涉及到錢的地方要倍加小心。
(2).在回調路由指向的方法內,如果你的支付成功的邏輯成功運行了,需要return true;如果沒有成功進行資料庫操作,需要返回false;或不返回,微信會再一次發送回調信息(post方式)。
七、一些easywechat官方的建議:
這里需要注意的有幾個點:
1.handleNotify 只接收一個 callable 參數,通常用一個匿名函數即可。
2.該匿名函數接收兩個參數,這兩個參數分別為:
$notify 為封裝了通知信息的 EasyWeChat\Support\Collection 對象,前面已經講過這里就不贅述了,你可以以對象或者數組形式來讀取通知內容,比如:$notify->totalfee 或者 $notify['totalfee']。
$successful 這個參數其實就是判斷 用戶是否付款成功了(result_code == 『SUCCESS』)
3.該函數返回值就是告訴微信 「我是否處理完成」,如果你返回一個 false 或者一個具體的錯誤消息,那麼微信會在稍後再次繼續通知你,直到你明確的告訴它:「我已經處理完成了」,在函數里 return true; 代表處理完成。
4.handleNotify 返回值 $response 是一個 Response 對象,如果你要直接輸出,使用 $response->send(), 在一些框架里不是輸出而是返回:return $response。
5.注意:請把 「支付成功與否」 與 「是否處理完成」 分開,它倆沒有必然關系。
比如:微信通知你用戶支付完成,但是支付失敗了(result_code 為 『FAIL』),你應該更新你的訂單為支付失敗,但是要告訴微信處理完成。
後記
1.在微信開發中,大量用到了laravel自帶的Log查錯的方法,當var_mp(),echo(),dd()等方法不能查看錯誤信息是,使用日誌查錯就可以解決了。怎樣使用laravel的log服務,這個以後會講。
2.本項目開發可以說是組件化開發,有開發速度快,代碼質量高,維護成本低等優點,本例的微信開發是一個縮影。
[原文地址](http://www.blog8090.com/)
7. php寫微信支付怎麼能吧需要付款的金額傳參給二維碼
1.可以先新建一個page頁面,也就是後台的新建頁面,然後在後台的設置閱讀裡面可以設定首頁顯示一個靜態頁面。2.可以修改你的首頁模板,將裡面的循環文章的調用和文章的代碼刪除,之後再換成你的代碼當然兩種方式都差不多,可能對你來說,第一種比較合適一些。希望對你有用。樓主可以去後盾人看看,那裡有豐富的教學視頻可以學習
8. 如何利用PHP實現 APP端微信支付功能
一丶PHP後台後台生成預支付交易單,返回正確的預支付交易回話標識後再在APP裡面調起支付!官方文檔:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
根據文檔拼接微信需要的參數,這里需要幾個方法,直接上代碼!
傳輸給微信的參數要組裝成xml格式發送,傳如參數數組!
publicfunctionToXml($data=array())
{
if(!is_array($data)||count($data)<=0)
{
return'數組異常';
}
$xml="";
foreach($dataas$key=>$val)
{
if(is_numeric($val)){
$xml.="<".$key.">".$val."";
}else{
$xml.="<".$key.">";
}
}
$xml.="";
return$xml;
}
2.生成隨機字元串,微信所需參數!這里方法很多,看自己愛好都行!
functionrand_code(){
$str='';//62個字元
$str=str_shuffle($str);
$str=substr($str,0,32);
return$str;
}
3.這里是微信比較重要的一步了,這個方法會多次用到!生成簽名
privatefunctiongetSign($params){
ksort($params);//將參數數組按照參數名ASCII碼從小到大排序
foreach($paramsas$key=>$item){
if(!empty($item)){//剔除參數值為空的參數
$newArr[]=$key.'='.$item;//整合新的參數數組
}
}
$stringA=implode("&",$newArr);//使用&符號連接參數
$stringSignTemp=$stringA."&key="."************************";//拼接key
//key是在商戶平台API安全里自己設置的
$stringSignTemp=MD5($stringSignTemp);//將字元串進行MD5加密
$sign=strtoupper($stringSignTemp);//將所有字元轉換為大寫
return$sign;
}
4.傳遞參數給微信,生成預支付訂單!接收微信返回的數據,在反給APP端,APP端調用支付介面,完成支付!APP端所需參數見微信文檔:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2
publicfunctionwx_pay(){
$nonce_str=$this->rand_code();//調用隨機字元串生成方法獲取隨機字元串
$data['appid']='wxdbc5dc*******';//appid
$data['mch_id']='1493*****';//商戶號
$data['body']="APP支付測試";
$data['spbill_create_ip']=$_SERVER['HTTP_HOST'];//ip地址
$data['total_fee']=1;//金額
$data['out_trade_no']=time().mt_rand(10000,99999);//商戶訂單號,不能重復
$data['nonce_str']=$nonce_str;//隨機字元串
$data['notify_url']='https://www.5wx.org/';接收支付後的通知,必須為能直接訪問的網址,不能跟參數
$data['trade_type']='APP';//支付方式
//將參與簽名的數據保存到數組注意:以上幾個參數是追加到$data中的,$data中應該同時包含開發文檔中要求必填的剔除sign以外的所有數據
$data['sign']=$this->getSign($data);//獲取簽名
$xml=$this->ToXml($data);//數組轉xml
//curl傳遞給微信方
$url="https://api.mch.weixin.qq.com/pay/unifiedorder";
//header("Content-type:text/xml");
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
if(stripos($url,"https://")!==FALSE){
curl_setopt($ch,CURLOPT_SSLVERSION,CURL_SSLVERSION_TLSv1);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
}else{
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//嚴格校驗
}
//設置header
curl_setopt($ch,CURLOPT_SSLVERSION,CURL_SSLVERSION_TLSv1);
curl_setopt($ch,CURLOPT_HEADER,FALSE);
//要求結果為字元串且輸出到屏幕上
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
//設置超時
curl_setopt($ch,CURLOPT_TIMEOUT,30);
curl_setopt($ch,CURLOPT_POST,TRUE);
//傳輸文件
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
//運行curl
$data=curl_exec($ch);
//返回結果
if($data){
curl_close($ch);
//返回成功,將xml數據轉換為數組.
$re=$this->FromXml($data);
if($re['return_code']!='SUCCESS'){
json("201",'簽名失敗');
}
else{
//接收微信返回的數據,傳給APP!
$arr=array(
'prepayid'=>$re['prepay_id'],
'appid'=>'wxdbc5dc*****',
'partnerid'=>'14937****',
'package'=>'Sign=WXPay',
'noncestr'=>$nonce_str,
'timestamp'=>time(),
);
//第二次生成簽名
$sign=$this->getSign($arr);
$arr['sign']=$sign;
json('200','簽名成功',$arr);
}
}else{
$error=curl_errno($ch);
curl_close($ch);
json('201',"curl出錯,錯誤碼:$error");
}
}
5.將xml數據轉換為數組,接收微信返回數據時用到.
publicfunctionFromXml($xml)
{
if(!$xml){
echo"xml數據異常!";
}
//將XML轉為array
//禁止引用外部xml實體
libxml_disable_entity_loader(true);
$data=json_decode(json_encode(simplexml_load_string($xml,'SimpleXMLElement',LIBXML_NOCDATA)),true);
return$data;
}
二.APP支付成功後,會調用你填寫的回調地址.返回參數詳見微信文檔:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3
//微信支付回調
functionwx_notify(){
//接收微信返回的數據數據,返回的xml格式
$xmlData=file_get_contents('php://input');
//將xml格式轉換為數組
$data=$this->FromXml($xmlData);
//用日誌記錄檢查數據是否接受成功,驗證成功一次之後,可刪除。
$file=fopen('./log.txt','a+');
fwrite($file,var_export($data,true));
//為了防止假數據,驗證簽名是否和返回的一樣。
//記錄一下,返回回來的簽名,生成簽名的時候,必須剔除sign欄位。
$sign=$data['sign'];
unset($data['sign']);
if($sign==$this->getSign($data)){
//簽名驗證成功後,判斷返回微信返回的
if($data['result_code']=='SUCCESS'){
//根據返回的訂單號做業務邏輯
$arr=array(
'pay_status'=>1,
);
$re=M('order')->where(['order_sn'=>$data['out_trade_no']])->save($arr);
//處理完成之後,告訴微信成功結果!
if($re){
echo'';exit();
}
}
//支付失敗,輸出錯誤信息
else{
$file=fopen('./log.txt','a+');
fwrite($file,"錯誤信息:".$data['return_msg'].date("Y-m-dH:i:s"),time()." ");
}
}
else{
$file=fopen('./log.txt','a+');
fwrite($file,"錯誤信息:簽名驗證失敗".date("Y-m-dH:i:s"),time()." ");
}
}
在這里,微信APP支付流程就成功走完了!謝謝支持!
---------------------