微信phpsdk
⑴ thinkphp微信h5支付sdk怎麼用
主要的支付代碼如下:
<?php
namespaceHomeController;
useThinkController;
//微信支付類
{
//獲取access_token過程中的跳轉uri,通過跳轉將code傳入jsapi支付頁面
publicfunctionjs_api_call(){
$order_sn=I('get.order_sn','');
if(empty($order_sn)){
header('location:'.__ROOT__.'/');
}
vendor('Weixinpay.WxPayPubHelper');
//使用jsapi介面
$jsApi=newJsApi_pub();
//=========步驟1:網頁授權獲取用戶openid============
//通過code獲得openid
if(!isset($_GET['code'])){
//觸發微信返回code碼
$url=$jsApi->createOauthUrlForCode('域名/Wxpay/js_api_call?order_sn='.$order_sn);
//$url=$jsApi->createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL);
Header("Location:$url");
}else{
//獲取code碼,以獲取openid
$code=$_GET['code'];
$jsApi->setCode($code);
$openid=$jsApi->getOpenId();
}
$res=array(
'order_sn'=>'20150109113322',
'order_amount'=>255
);
//=========步驟2:使用統一支付介面,獲取prepay_id============
//使用統一支付介面
$unifiedOrder=newUnifiedOrder_pub();
//設置統一支付介面參數
//設置必填參數
//appid已填,商戶無需重復填寫
//mch_id已填,商戶無需重復填寫
//noncestr已填,商戶無需重復填寫
//spbill_create_ip已填,商戶無需重復填寫
//sign已填,商戶無需重復填寫
$total_fee=$res['order_amount']*100;
//$total_fee=1;
$body="訂單支付{$res['order_sn']}";
$unifiedOrder->setParameter("openid","$openid");//用戶標識
$unifiedOrder->setParameter("body",$body);//商品描述
//自定義訂單號,此處僅作舉例
$out_trade_no=$res['order_sn'];
$unifiedOrder->setParameter("out_trade_no",$out_trade_no);//商戶訂單號
$unifiedOrder->setParameter("total_fee",$total_fee);//總金額
//$unifiedOrder->setParameter("attach","order_sn={$res['order_sn']}");//附加數據
$unifiedOrder->setParameter("notify_url",WxPayConf_pub::NOTIFY_URL);//通知地址
$unifiedOrder->setParameter("trade_type","JSAPI");//交易類型
//非必填參數,商戶可根據實際情況選填
//$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商戶號
//$unifiedOrder->setParameter("device_info","XXXX");//設備號
//$unifiedOrder->setParameter("attach","XXXX");//附加數據
//$unifiedOrder->setParameter("time_start","XXXX");//交易起始時間
//$unifiedOrder->setParameter("time_expire","XXXX");//交易結束時間
//$unifiedOrder->setParameter("goods_tag","XXXX");//商品標記
//$unifiedOrder->setParameter("openid","XXXX");//用戶標識
//$unifiedOrder->setParameter("proct_id","XXXX");//商品ID
$prepay_id=$unifiedOrder->getPrepayId();
//=========步驟3:使用jsapi調起支付============
$jsApi->setPrepayId($prepay_id);
$jsApiParameters=$jsApi->getParameters();
$wxconf=json_decode($jsApiParameters,true);
if($wxconf['package']=='prepay_id='){
$this->error('當前訂單存在異常,不能使用支付');
}
$this->assign('res',$res);
$this->assign('jsApiParameters',$jsApiParameters);
$this->display('jsapi');
}
//非同步通知url,商戶根據實際開發過程設定
publicfunctionnotify_url(){
vendor('Weixinpay.WxPayPubHelper');
//使用通用通知介面
$notify=newNotify_pub();
//存儲微信的回調
$xml=$GLOBALS['HTTP_RAW_POST_DATA'];
$notify->saveData($xml);
//驗證簽名,並回應微信。
//對後台通知交互時,如果微信收到商戶的應答不是成功或超時,微信認為通知失敗,
//微信會通過一定的策略(如30分鍾共8次)定期重新發起通知,
//盡可能提高通知的成功率,但微信不保證通知最終能成功。
if($notify->checkSign()==FALSE){
$notify->setReturnParameter("return_code","FAIL");//返回狀態碼
$notify->setReturnParameter("return_msg","簽名失敗");//返回信息
}else{
$notify->setReturnParameter("return_code","SUCCESS");//設置返回碼
}
$returnXml=$notify->returnXml();
//==商戶根據實際情況設置相應的處理流程,此處僅作舉例=======
//以log文件形式記錄回調信息
//$log_name="notify_url.log";//log文件路徑
//$this->log_result($log_name,"【接收到的notify通知】: ".$xml." ");
$parameter=$notify->xmlToArray($xml);
//$this->log_result($log_name,"【接收到的notify通知】: ".$parameter." ");
if($notify->checkSign()==TRUE){
if($notify->data["return_code"]=="FAIL"){
//此處應該更新一下訂單狀態,商戶自行增刪操作
//$this->log_result($log_name,"【通信出錯】: ".$xml." ");
//更新訂單數據【通信出錯】設為無效訂單
echo'error';
}
elseif($notify->data["result_code"]=="FAIL"){
//此處應該更新一下訂單狀態,商戶自行增刪操作
//$this->log_result($log_name,"【業務出錯】: ".$xml." ");
//更新訂單數據【通信出錯】設為無效訂單
echo'error';
}
else{
//$this->log_result($log_name,"【支付成功】: ".$xml." ");
//我這里用到一個process方法,成功返回數據後處理,返回地數據具體可以參考微信的文檔
if($this->process($parameter)){
//處理成功後輸出success,微信就不會再下發請求了
echo'success';
}else{
//沒有處理成功,微信會間隔的發送請求
echo'error';
}
}
}
}
//訂單處理
privatefunctionprocess($parameter){
//此處應該更新一下訂單狀態,商戶自行增刪操作
/*
*返回的數據最少有以下幾個
*$parameter=array(
'out_trade_no'=>xxx,//商戶訂單號
'total_fee'=>XXXX,//支付金額
'openid'=>XXxxx,//付款的用戶ID
);
*/
returntrue;
}
}
?>
⑵ 微信v3掃碼支付二返回的notify.php怎麼接收回調的值
其實在寫這篇文章的時候感覺自己已經落伍了,不過筆者在網路上搜索"微信支付開發之掃描支付(模式二)後如何回調"尋找答案時,發現依舊有很多朋友沒有解決這個問題,所以就把自己的解決思路分享給大家。
一、下載微信支付SDK(筆者以php發開為例,sdk包為WxpayAPI_php_v3.zip)下載SDK包後解壓,在解壓目錄下,我們會看到如下目錄二、查閱微信支付開發者文檔後得知,微信掃碼支付的demo即為example目錄下的native.php文件為了方便,我們要做的是將整個解壓後的文件放入到本地環境的根目錄下的wxpay(可隨個人喜好命名)文件夾中三、以筆者為例,在瀏覽器中輸入http://localhost/wxpay/example/native.php打開上面網址後,發現有兩個二維碼,如題,我們今天研究的是模式二掃碼(官方也推薦模式二掃碼支付)四、我們用手機登陸微信,掃描上面頁面中的模式二的二維碼,並且支付在這里我們發現一個有趣的問題,當你支付成功後,PC頁面中並沒有發生任何變化,所以我們考慮的主要問題是,支付後如何進行回調。
這里不說多的廢話了,筆者參考了網上的諸多方法,總結如下:
1、刪掉native.php文件中掃碼模式一的一些html,只剩下掃碼模式二的一些相關html代碼。
2、由於官方文檔中也說明了,掃碼模式二的支付結果是非同步響應,不會主動返回支付結果,所以我們採用了javascript去時時監聽支付結果,然後根據請求的結果,在做下一步的頁面回調。筆者最終代碼如下,有興趣的朋友可以參考下:
native.php文件
復制代碼
1 <?php
2 ini_set('date.timezone','Asia/Shanghai');3 //error_reporting(E_ERROR);
4
5 require_once "../lib/WxPay.Api.php";
6 require_once "WxPay.NativePay.php";
7 require_once 'log.php';
8
9 //模式一
10 /**
11 * 流程:
12 * 1、組裝包含支付信息的url,生成二維碼13 * 2、用戶掃描二維碼,進行支付
14 * 3、確定支付之後,微信伺服器會回調預先配置的回調地址,在【微信開放平台-微信支付-支付配置】中進行配置15 * 4、在接到回調通知之後,用戶進行統一下單支付,並返回支付信息以完成支付(見:native_notify.php)16 * 5、支付完成之後,微信伺服器會通知支付成功17 * 6、在支付成功通知中需要查單確認是否真正支付成功(見:notify.php)18 */
19 $notify = new NativePay();
20 $url1 = $notify->GetPrePayUrl("123456789");21
22 //模式二
23 /**
24 * 流程:
25 * 1、調用統一下單,取得code_url,生成二維碼26 * 2、用戶掃描二維碼,進行支付
27 * 3、支付完成之後,微信伺服器會通知支付成功28 * 4、在支付成功通知中需要查單確認是否真正支付成功(見:notify.php)29 */
30 $input = new WxPayUnifiedOrder();
31 $input->SetBody("1分錢購買何寧");
32 $input->SetAttach("1分錢購買何寧");
33 $num=WxPayConfig::MCHID.date("YmdHis");34 $input->SetOut_trade_no($num);
35 $input->SetTotal_fee("1");
36 $input->SetTime_start(date("YmdHis"));37 $input->SetTime_expire(date("YmdHis", time() + 600));38 $input->SetGoods_tag("test");
39 $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");40 $input->SetTrade_type("NATIVE");
41 $input->SetProct_id("123456789");
42 $result = $notify->GetPayUrl($input);
43 $url2 = $result["code_url"];
44 ?>
45
46 <html>
47 <head>
48 <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
49 <meta name="viewport" content="width=device-width, initial-scale=1" />
50 <title>微信支付樣例</title>
51 </head>
52 <body>
53 <div style="margin-left: 10px;color:#556B2F;font-size:30px;font-weight: bolder;">掃描支付模式二</div><br/>
54 <img alt="模式二掃碼支付" src="qrcode.php?data=<?php echo urlencode($url2);?>" style="width:150px;height:150px;"/>
55 <div id="myDiv"></div><div id="timer">0</div>
56 <script>
57 //設置每隔1000毫秒執行一次load() 方法58 var myIntval=setInterval(function(){load()},1000);59 function load(){
60 document.getElementById("timer").innerHTML=parseInt(document.getElementById("timer").innerHTML)+1;61 var xmlhttp;
62 if (window.XMLHttpRequest){
63 // code for IE7+, Firefox, Chrome, Opera, Safari64 xmlhttp=new XMLHttpRequest();65 }else{
66 // code for IE6, IE5
67 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");68 }
69 xmlhttp.onreadystatechange=function(){70 if (xmlhttp.readyState==4 && xmlhttp.status==200){71 trade_state=xmlhttp.responseText;72 if(trade_state=='SUCCESS'){73 document.getElementById("myDiv").innerHTML='支付成功';74 //alert(transaction_id);75 //延遲3000毫秒執行tz() 方法76 clearInterval(myIntval);77 setTimeout("location.href='success.php'",3000);78
79 }else if(trade_state=='REFUND'){80 document.getElementById("myDiv").innerHTML='轉入退款';81 clearInterval(myIntval);82 }else if(trade_state=='NOTPAY'){83 document.getElementById("myDiv").innerHTML='請掃碼支付';84
85 }else if(trade_state=='CLOSED'){86 document.getElementById("myDiv").innerHTML='已關閉';87 clearInterval(myIntval);88 }else if(trade_state=='REVOKED'){89 document.getElementById("myDiv").innerHTML='已撤銷';90 clearInterval(myIntval);91 }else if(trade_state=='USERPAYING'){92 document.getElementById("myDiv").innerHTML='用戶支付中';93 }else if(trade_state=='PAYERROR'){94 document.getElementById("myDiv").innerHTML='支付失敗';95 clearInterval(myIntval);96 }
97
98 }
99 }
100 //orderquery.php 文件返回訂單狀態,通過訂單狀態確定支付狀態101 xmlhttp.open("POST","orderquery.php",false);102 //下面這句話必須有
103 //把標簽/值對添加到要發送的頭文件。
104 xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");105 xmlhttp.send("out_trade_no=<?php echo $num;?>");106
107 }
108 </script>
109
110 </body>
111 </html>
復制代碼
orderquery.php代碼也做了相應調整:
<?php
ini_set('date.timezone','Asia/Shanghai');error_reporting(E_ERROR);
require_once "../lib/WxPay.Api.php";
require_once 'log.php';
//初始化日誌
$logHandler= new CLogFileHandler("./logs/".date('Y-m-d').'.log');$log = Log::Init($logHandler, 15);
function printf_info($data)
{
foreach($data as $key=>$value){
echo "<font color='#f00;'>$key</font> : $value <br/>";}
}
if(isset($_REQUEST["transaction_id"]) && $_REQUEST["transaction_id"] != ""){$transaction_id = $_REQUEST["transaction_id"];$input = new WxPayOrderQuery();
$input->SetTransaction_id($transaction_id);//printf_info(WxPayApi::orderQuery($input));$result=WxPayApi::orderQuery($input);
echo $result['trade_state'];
exit();
}
if(isset($_REQUEST["out_trade_no"]) && $_REQUEST["out_trade_no"] != ""){$out_trade_no = $_REQUEST["out_trade_no"];$input = new WxPayOrderQuery();
$input->SetOut_trade_no($out_trade_no);
//printf_info(WxPayApi::orderQuery($input));$result=WxPayApi::orderQuery($input);
echo $result['trade_state'];
exit();
}
?>
新建success.php文件:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>微信支付成功</title>
</head>
<body>
<br /><br /><br /><br /><br /><br /><br />
<h1>微信支付成功</h1>
</body>
</html>
⑶ 我想做微信支付的測試 可是我沒有商家公眾號怎麼辦
對於首次使用微信支付的用戶來說,需要在使用時綁定銀行卡,並完成身份認證:
1、用微信「掃一掃」掃描商品二維碼或直接點擊微信官方認證公眾號的購買鏈接,
2、點擊「付款」按鈕開始使用微信支付,支付時需要綁定銀行卡,輸入持卡人銀行卡號碼,然後點擊「下一步」按鈕。
3、輸入銀行卡類型、銀行預留持卡人姓名、身份證、手機號等個人信息,稍後會收到簡訊驗證碼,微信會自動獲取簡訊驗證碼,點擊「下一步」按鈕即可。
4、下一步需要設置微信安全支付6位數字密碼,一般不建議用生日或銀行卡密碼。
5、綁定銀行卡後,下次在公眾號支付、掃二維碼支付、微信刷卡支付、APP支付時就不需要再次綁定,只需輸入支付密碼即可完成支付。
⑷ php 微信第三方登錄有sdk下載嗎,有的話在哪裡,沒有的話應該怎麼做
官方有介面有教程,但是沒有具體sdk,你可以去新浪雲下載
⑸ 微信支付 NATIVE 掃碼 PHP SDK 查詢訂單 官方 Demo 是不是有問題
沒有問題的,SDK里的demo只不過是演示,是需要開發者根據自己的需求更改的
⑹ 不用php怎麼調用微信jssdk
使用姿勢
^ajax(Common.ServerUrl+"GetWX.php",{
data:{
Type:"config",
url:location.href.split('#')[0]
},
dataType:'json',
type:'get',
timeout:5000,
success:function(data){
wx.config({
debug:true,//開啟調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時才會列印。
appId:'……',//必填,公眾號的唯一標識
timestamp:data.timestamp,//必填,生成簽名的時間戳
nonceStr:data.nonceStr,//必填,生成簽名的隨機串
signature:data.signature,//必填,簽名,見附錄1
jsApiList:["getLocation"]//必填,需要使用的JS介面列表,所有JS介面列表見附錄2
});
}
})
wx.ready(function(){
wx.getLocation({
type:'wgs84',//默認為wgs84的gps坐標,如果要返回直接給openLocation用的火星坐標,可傳入'gcj02'
success:function(res){
varlatitude=res.latitude;//緯度,浮點數,范圍為90~-90
varlongitude=res.longitude;//經度,浮點數,范圍為180~-180。
plus2.storage.setItem("latitude",latitude);
plus2.storage.setItem("longitude",longitude);
}
});
});
服務端GetWX.PHP
<?php
include"lib/Cache.php";
define($APPID,"……");
define($SECRET,"……")
if($_GET['Type']=="access_token"){//echogetAccess_token();
}
elseif($_GET['Type']=="jsapi_ticket"){//echogetJsapi_ticket();
}
elseif($_GET['Type']=="config"){
$jsapi_ticket=getJsapi_ticket();
$nonceStr="x".rand(10000,100000)."x";//隨機字元串
$timestamp=time();//時間戳
$url=$_GET['url'];
$signature=getSignature($jsapi_ticket,$nonceStr,$timestamp,$url);
$result=array("jsapi_ticket"=>$jsapi_ticket,"nonceStr"=>$nonceStr,"timestamp"=>$timestamp,"url"=>$url,"signature"=>$signature);
echojson_encode($result);
}
functiongetSignature($jsapi_ticket,$noncestr,$timestamp,$url){
$string1="jsapi_ticket=".$jsapi_ticket."&noncestr=".$noncestr."×tamp=".$timestamp."&url=".$url;
$sha1=sha1($string1);
return$sha1;
}
functiongetJsapi_ticket(){
$cache=newCache();
$cache=newCache(7000,'cache/');//需要創建cache文件夾存儲緩存文件。
//從緩存從讀取鍵值$key的數據
$jsapi_ticket=$cache->get("jsapi_ticket");
$access_token=getAccess_token();
//如果沒有緩存數據
if($jsapi_ticket==false){
$access_token=getAccess_token();
$url='https://api.weixin.qq.com/cgi-bin/ticket/getticket';
$data=array('type'=>'jsapi','access_token'=>$access_token);
$header=array();
$response=json_decode(curl_https($url,$data,$header,5));
$jsapi_ticket=$response->ticket;
//寫入鍵值$key的數據
$cache->put("jsapi_ticket",$jsapi_ticket);
}
return$jsapi_ticket;
}
functiongetAccess_token(){
$cache=newCache();
$cache=newCache(7000,'cache/');
//從緩存從讀取鍵值$key的數據
$access_token=$cache->get("access_token");
//如果沒有緩存數據
if($access_token==false){
$url='https://api.weixin.qq.com/cgi-bin/token';
$data=array('grant_type'=>'client_credential','appid'=>$APPID,'secret'=>$SECRET);
$header=array();
$response=json_decode(curl_https($url,$data,$header,5));
$access_token=$response->access_token;
//寫入鍵值$key的數據
$cache->put("access_token",$access_token);
}
return$access_token;
}
/**curl獲取https請求
*@paramString$url請求的url
*@paramArray$data要發送的數據
*@paramArray$header請求時發送的header
*@paramint$timeout超時時間,默認30s
*/
functioncurl_https($url,$data=array(),$header=array(),$timeout=30){
$ch=curl_init();
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);//跳過證書檢查
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_HTTPHEADER,$header);
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,http_build_query($data));
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_TIMEOUT,$timeout);
$response=curl_exec($ch);
if($error=curl_error($ch)){
die($error);
}
curl_close($ch);
return$response;
}
?>
Cache.php
<?phpclassCache{
private$cache_path;
//pathforthecache
private$cache_expire;
//secondsthatthecacheexpires
//cacheconstructor,
publicfunctionCache($exp_time=3600,$path="cache/"){
$this->cache_expire=$exp_time;
$this->cache_path=$path;
}
//returnsthefilenameforthecache
privatefunctionfileName($key){
return$this->cache_path.md5($key);
}
//,$key==nameofthecache,datatheinfo/valuestostore
publicfunctionput($key,$data){
$values=serialize($data);
$filename=$this->fileName($key);
$file=fopen($filename,'w');
if($file){//abletocreatethefile
fwrite($file,$values);
fclose($file);
}else
returnfalse;
}
//returnscacheforthegivenkey
publicfunctionget($key){
$filename=$this->fileName($key);
if(!file_exists($filename)||!is_readable($filename)){//can'treadthecache
returnfalse;
}
if(time()<(filemtime($filename)+$this->cache_expire)){//cacheforthekeynotexpired
$file=fopen($filename,"r");
//readdatafile
if($file){//abletoopenthefile
$data=fread($file,filesize($filename));
fclose($file);
returnunserialize($data);
//returnthevalues
}else
returnfalse;
}else
returnfalse;
//wasexpiredyouneedtocreatenew
}
}?>
⑺ 微信支付php sdk怎麼使用
它裡面集成了微信支付的很多功能函數。
你只需要直接調用這個介面即可,
如果能看的明白代碼,你也可以自己根據自己的喜歡封裝成類。
具體的用法只能去找api文檔。
⑻ 微信是不是只提供了php和js的sdk
沒有官方版本。
在Github上有一個正在維護的非官方版本wechat-python-sdk。其實就是把微信的API包裝一下,使用起來應該沒問題。
⑼ douchat是什麼軟體
douchat(豆信)是一個專注於微信公眾號開發的開源框架,具備「簡潔、高效、優雅、易擴展」等特點。自主研發的插件,擴展機制與視圖構建工具,能夠幫助開發者快速實現微信端功能的開發,對微信介面進行了高度封裝。
能夠輕松的處理微信端用戶發送的文本、語音、視頻、位置、鏈接等類型消息,亦可對關注、取消關注、掃碼、點擊菜單、上報地理位置等事件進行靈活處理。產品特色:
1、引入了Github上最為流行的Wechat-php-sdk類庫,對微信介面實現高度封裝。
2、自主研發的插件擴展機制,保證功能的高度可擴展性。
3、自主研發的視圖構建工具,能夠幫助開發者在控制器中通過簡單的配置快速生成視圖,靈活性強大到甚至不需要寫任何一行HTML代碼。
4、高度封裝的微信交互API,可輕松處理微信端用戶發送的文本、語音、視頻、位置、鏈接等類型消息,亦可對關注、取消關注、掃碼、點擊菜單、上報地理位置等事件進行靈活處理。
5、封裝了微信支付、客服群發、模板消息、帶參數二維碼等微信高級功能的實現方法,開發者在插件開發的過程中可以簡單的用一個函數實現上述功能。
6、整合jssdk封裝了上傳、自定義分享、支付彈窗、LBS定位、ajax請求等js方法,在模板頁面可以快速集成。
7、整合了weUI、FrozenUI、bootstrap等前端框架,在UI實現方面可快速集成。
8、詳細的開發手冊,旨在幫助開發愛好者快速上手豆信開發。
9、活躍的交流社區,讓每一個開發愛好者都能分享自己的看法與見解。
10、集成BUG反饋系統,產品保持高頻次更新與迭代。
⑽ php開發微信jssdk介面 iphone手機當一次多圖上傳時,只有一張上傳成功怎麼回事,安
微信上傳圖片,只能遞歸方法上傳多張,所以你可能是JS代碼里只上傳了一次