ホームページ >php教程 >php手册 >ciフレームワークを使用したWeChatアプリ決済

ciフレームワークを使用したWeChatアプリ決済

WBOY
WBOYオリジナル
2016-09-03 00:00:411203ブラウズ

/**
* WeChat アプリ支払いを組み合わせて prepayid を取得します
* @param int $order_num
*/
private function _wxpay_request($order_num = 0)
{

// 注文番号が 0 ではなく配列でなければならないことを決定します
Payment E library_include ("wxpay/", "wxpayhelper.app) .php");

// 支払いインターフェースの開始 URL
$ pay_url = $This-> ITEM ("Pay_url"); 通知アドレス
$notify_url = $this->config->item("WEIXIN_NOTIFY_URL") ); ("WEIXIN_PAY_NEED");


$helper = order_data = $this->order_model->

$ data ["appid] "] = $ pay_config ['appid']; / / WeChat オープン プラットフォームによってレビューされたアプリケーション レビュー appid
$ data ["body"] = $ pay_config ['body'] ;//商品または支払い注文の簡単な説明
$data["mch_id"] ["notify_url" ] = $notify_url; //通知アドレス
$data["out_trade_no"] = $order_data["order_num"];//販売者注文番号
$data["spbill_create_ip"] = $helper->get_client_ip ();/ /ターミナルIP
$ data ["total_fee" ["sign"] = $ helper-> getsign($ data、$ pay_config ['partners']); // signature

= $ helper-> postxmlcurl($ xml , $pay_url); responseArr ["return_code"]) && $responseArr["return_code"]=='SUCCESS' && isset($responseArr['result_code']) && $responseArr["result_code"]=='SUCCESS') {
$data_pay ["appid"] $data_pay[ $data_pay["partnerid"] = $pay_config ['mch_id'];            $data_pay["sign"] = $helper->getSign($data_pay, $pay_config['partner']);//二次签名


$this->response = array('status'=&gと; 0, 'msg'=>'success', 'data'=>$data_pay);
}else{

$return_msg = $responseArr['err_code_des'];    
$this->response = array('status'=>0, 'msg'=>$return_msg, 'data'=>$responseArr);
}




}

//helper.php


class WxPayHelper{

/**
* 署名の検証
* @param array $data
* @param string $key
* @return string
*/
function getVerifySign($data, $key)
{
$String = $this->formatParameters($data, false);
//署名ステップ 2: 文字列 4 の後に KEY を追加: すべての文字を大文字に変換します
$result =
' s アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウト アウトcrest dder gi it It It It It It It It It 't s t = "";
KSORT($ paramap); ){
$ v = urlencode($ v); -> ;formatBizQueryParaMap($Parameters, false);
//署名ステップ 2: string の後に KEY を追加します
(md5($String));
return $result; 3456789abcdefghijklmnopqrstuvwxyz";
$max = strlen($strPol) )-1 ;
for ($i=0; $i<$length;$i++){
,$max) 2 つの数値の最小値と最大値の間のランダムな整数を生成します
}
を使用して を使用してusing using 's ' を通じて 's ' を通じて using ' を通じて 's ' を通じて using using using ‐ ‐ ‐‐‐‐ return $str;        header("コンテンツタイプ: text/xml");            

$xml = '';    

foreach ($arr as $key=>$val)
{
if (is_numeric($val))
{
$xml.="<".$ key.">".$val." ";

}
else
$xml.="<".$key.">";  
}
$xml.= '
';
return $xml;
}

/**
* 投稿モードで対応するインターフェイス URL に xml を送信します
*
* @param string $xml 投稿に必要な XML データ
* @param string $url url
* @param bool $useCert 証明書が必要かどうかデフォルトでは
* @param int $sec URL 実行タイムアウト、デフォルトは 30 秒
* @throws WxPayException
*/
function postXmlCurl($xml, $url, $second=30, $useCert=false, $sslcert_path='', $sslkey_path='')
{

$ch =curl_init();
//設置時間
curl_setopt($ch, CURLOPT_TIMEOUT, $sec);
curl_setopt($ch,CURLOPT_URL, $url);

//設置ヘッダー
curl_setopt($ch, CURLOPT_HEADER, FALSE) ;
// 要求结結果文字符であり画面上に出力されます
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);

if ($useCert == true){
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
/ /设置证书
//使用证书:cert と key 分别所属两个.pem文件
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT, $sslcert_path);
curl_setopt( $ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch, CURLOPT_SSLKEY, $sslkey_path);
}
//ポスト提交方式
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
//运行curl
$data =curl_exec($ch );

//返结果
if($data){
curl_close($ch);
return $data;
} else {
$error =curl_errno($ch);

curl_close($ch);
return false;
}
}

/**
     * 取得当前サービスの IP
* @return 曖昧な
*/
function get_client_ip()
{
if (isset($_SERVER['REMOTE_ADDR'])) {
$cip = $_SERVER[' REMOTE_ADDR'];
} elseif (getenv("REMOTE_ADDR")) {
$cip = getenv("REMOTE_ADDR");
} elseif (getenv("HTTP_CLIENT_IP")) {
$cip = env("HTTP_CLIENT_IP");
} else {
$cip = "127.0.0.1";
}
return $cip;
}

/**​​​​*/
function formatBizQueryParaMap($paraM ap、$urlencode)
{
$buff = " ";
ksort($paraMap);
foreach ($paraMap as $k => $v)
{
if($urlencode)
{
$v = lencode($v);
}
$buff .= strto lower($k) 。 「=」。 $v 。 "&";
}
$reqPar;
if (strlen($buff) > 0)
{
$reqPar = substr($buff, 0, strlen($buff)-1);
}
$reqPar を返す;
}

/**
* XML から配列
* @param 不明 $xml
* @returnmixed
*/
function xmlToArray($xml)
{
// 将XML转をarray
$array_data (json_encode(simplexml_load_string($) xml、'SimpleXMLElement'、LIBXML_NOCDATA)) 、 true);
return $array_data;
}

}


?>



//异步通知

/**
* WeChat メッセージ アドレス
*/
public function weixin_notify()
{


library_include("wxpay/", "WxPayHelper.app.php");
$helper = newあたり();        
//微信構成
$pay_config = $this->config->item("WEIXIN_PAY_NEED");    


$xml = file_get_contents("php://input");

if(!$xml){
exit('');
}

$wx_back = $helper->xmlToArray($xml);


if (空($wx_back)){
exit('< ;xml>') ;
}
$checkSign = $helper->getVerifySign($wx_back, $pay_config['partner']);

//验证签名
if($ checkSign==$wx_back['sign']){

if (isset($wx_back['result_code']) && $wx_back['result_code']=='SUCCESS') {
$requestReturnData = file_get_contents("php://input");
//商户订单号
$ out_trade_no = $wx_back['out_trade_no'];



// 三方订单编号
$third_order _num = $wx_back["transaction_id"];

//取引状況态
$trade_status = $wx_back['result_code'];

//订单金额保持小数点後两位
$total_fee = sprintf("%.2f"/100);

//公司业务处理


//处理後同步返给微信
exit('');
}


}
exit(' ');


}

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。