/*==============================微信生成預支付訂單===============================================*/
/*
* @param APP微信支付
* @param uid 用戶id
* @param token 用戶token
* @param oid 訂單id
* @param title 標題描述
* @param attach 附加數據
* @parma money 金額
*/
須要下載微信包 修改微信 WxPay.Config.Interface.php WxPay.Config.php 文件配置
微信官網文檔: https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
public function wx_pay()
{
$data = input("post.");
//獲取訂單數據,生成支付接口數據
$input = new \WxPayUnifiedOrder();
$input->SetBody($data['title']);
$input->SetAttach($data['attach']);
$input->SetOut_trade_no($data['ordernum']);
$input->SetTotal_fee($data['money']*100);//$info['money']*100 微信金額以分爲單位須要*100
$input->SetTime_start(date("YmdHis",time()));
$input->SetTime_expire(date("YmdHis",time()+600));
$input->SetSpbill_create_ip(get_client_ip());
$payReturn = 'http://tapi.zuozuobang.com/wx_notify';
$input->SetNotify_url($payReturn);
$input->SetTrade_type("APP");
$wx = new \WxPayConfigInterface();
$order = \WxPayApi::unifiedOrder($wx,$input);
if($order['return_msg']=="OK"){
//微信包裏面的,我用的是下面本身封裝的
// $tools = new \JsApiPay();
// $jsApiParameters = $tools->GetJsApiParameters($order);
// $jsApiParameters = json_decode($jsApiParameters);
// return_msg('200',"微信支付調用成功",$jsApiParameters);
//自封裝的sing簽名,二次生成簽名,二次生成簽名是如下幾個參數和第一次提交信息生成的簽名不一致
$result = array(
"appid" => $order['appid'],
"noncestr" => $this->rand_code(),
"package" => "Sign=WXPay",
"prepayid" => $order['prepay_id'],
"partnerid" => $order['mch_id'],
"timestamp" => time(),
);
$result['sing'] = $this->getSign($result);
return_msg("200","微信支付調用成功",$result);
}else{
return_msg("100","調用失敗",$order);
}
}
/*
* 微信支付回調
*/
function wx_notify()
{
//接收微信返回的數據數據,返回的xml格式
$xmlData = file_get_contents('php://input');
$daparam = new \WxPayUnifiedOrder();
//將xml格式轉換爲數組 返回數據官網文檔:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3
$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') {
//根據返回的訂單號作業務邏輯
$update = array(
'status' => '2', //修改支付狀態
'zhi_time' => time(), //添加支付時間
'pay_type' => 2); //添加支付類型
$re = Db::table("order")->where('ordernum', $data['out_trade_no'])->update($update);
$res = Db::table("order")->where('ordernum', $data['out_trade_no'])->field('mid,id,ordernum,nickname,addtime,pay_type')->find();
//添加充值記錄
$res['payorder'] = $data['transaction_id'];
$res['money'] = number_format($data['total_fee']/100,2);
$addpay = $this->addpay($res);
//處理完成以後,告訴微信成功結果!
if ($re && $addpay) {
$str = '<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>';
return $str;
}else{
return 'tijiashibai';
}
} //支付失敗,輸出錯誤信息
else {
$file = fopen('./log.txt', 'a+');
fwrite($file, "錯誤信息:" . $data['return_msg'] . date("Y-m-d H:i:s"), time() . "\r\n");
return false;
}
} else {
$file = fopen('./log.txt', 'a+');
fwrite($file, "錯誤信息:簽名驗證失敗" . date("Y-m-d H:i:s"), time() . "\r\n");
return false;
}
}
/*
* ***生成隨機字符串,微信所需參數!
*/
function rand_code()
{
$str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';//62個字符
$str = str_shuffle($str);
$str = substr($str, 0, 32);
return $str;
}
/*
* ******生成簽名*********
*/
private function getSign($params)
{
ksort($params); //將參數數組按照參數名ASCII碼從小到大排序
foreach ($params as $key => $item) {
if (!empty($item)) { //剔除參數值爲空的參數
$newArr[] = $key . '=' . $item; // 整合新的參數數組
}
}
$stringA = implode("&", $newArr); //使用 & 符號鏈接參數
$stringSignTemp = $stringA . "&key=" . config('wx_key');
// key是在商戶平臺API安全裏本身設置的
$stringSignTemp = hash_hmac("sha256",$stringSignTemp,config('wx_key')); //將字符串進行MD5加密
$sign = strtoupper($stringSignTemp); //將全部字符轉換爲大寫
return $sign;
}
/*
* ******傳輸給微信的參數要組成xml格式發送,傳入參數數組
*/
public function ToXml($data = array())
{
if (!is_array($data) || count($data) <= 0) {
return '數組異常';
}
$xml = "<xml>";
foreach ($data as $key => $val) {
if (is_numeric($val)) {
$xml .= "<" . $key . ">" . $val . "</" . $key . ">";
} else {
$xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
}
}
$xml .= "</xml>";
return $xml;
}
/*
* ******將xml數據轉換爲數組,接收微信返回數據時用到*********
*/
public function FromXml($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;
}