<?php
/**
* ECTouch Open Source Project
* ============================================================================
* Copyright (c) 2012-2014 liuwave@qq.com All rights reserved.
* ----------------------------------------------------------------------------
* 文件名称:wxpay.php
* ----------------------------------------------------------------------------
* 功能描述:微信手机支付插件
* ----------------------------------------------------------------------------
*
* ----------------------------------------------------------------------------
*/
/* 访问控制 */
if (! defined('IN_ECTOUCH')) {
die('Deny Access');
}
$payment_lang = ROOT_PATH . 'plugins/payment/language/' . C('lang') . '/' . basename(__FILE__);
if (file_exists($payment_lang)) {
include_once ($payment_lang);
L($_LANG);
}
/* 模块的基本信息 */
if (isset($set_modules) && $set_modules == TRUE) {
$i = isset($modules) ? count($modules) : 0;
/* 代码 */
$modules[$i]['code'] = basename(__FILE__, '.php');
/* 描述对应的语言项 */
$modules[$i]['desc'] = 'wxpay_desc';
/* 是否支持货到付款 */
$modules[$i]['is_cod'] = '0';
/* 是否支持在线支付 */
$modules[$i]['is_online'] = '1';
/* 作者 */
$modules[$i]['author'] = 'liuwave@qq.com';
/* 网址 */
$modules[$i]['website'] = 'http://www.baiwar.com/';
/* 版本号 */
$modules[$i]['version'] = '2.1.8';
/* 配置信息 */
/* 配置信息 */
$modules[$i]['config'] = array(
array('name' => 'wxpay_appid', 'type' => 'text', 'value' => ''),
array('name' => 'wxpay_appsecret', 'type' => 'text', 'value' => ''),
array('name' => 'wxpay_mchid', 'type' => 'text', 'value' => ''),
array('name' => 'wxpay_key', 'type' => 'text', 'value' => ''),
);
return;
}
/**
* 微信支付类
*/
class wxpay
{
var $parameters; // cft 参数
var $payment; // 配置信息
/**
* 生成支付代码
*
* @param array $order
* 订单信息
* @param array $payment
* 支付方式信息
*/
function get_code($order, $payment)
{
if (!defined('EC_CHARSET'))
{
$charset = 'utf-8';
}
else
{
$charset = EC_CHARSET;
}
$ua = strtolower($_SERVER['HTTP_USER_AGENT']);
if( !preg_match('/micromessenger/', $ua)){
return '<div style="text-align:center"><button class="btn btn-primary" type="button" disabled>'.L("wxpay_not_wx_button").'</button></div>';
}
if(!isset($_SESSION["openid"]) || empty($_SESSION["openid"]) || $_SESSION["openid"]==-1 ){
return '<div style="text-align:center"><button class="btn btn-primary" type="button" disabled>'.L("wxpay_not_openid_button").'</button></div>';
}
$charset = strtoupper($charset);
// 配置参数
$this->payment = $payment;
$notify_url=__URL__."/respondwx.php";
$this->logResult("log::get_code::notify_url:".$notify_url);
$this->setParameter("openid", $_SESSION["openid"]); // 商品描述
$this->setParameter("body", $order['order_sn']); // 商品描述
$this->setParameter("out_trade_no", $order['order_sn'] . 'O' . $order['log_id'].'O'.$order['order_amount'] * 100); // 商户订单号
$this->setParameter("total_fee", $order['order_amount'] * 100); // 总金额
$this->setParameter("notify_url", $notify_url); // 通知地址
$this->setParameter("trade_type", "JSAPI"); // 交易类型
$this->setParameter("input_charset", $charset);
$prepay_id = $this->getPrepayId();
if(empty($prepay_id)){
return '<div style="text-align:center"><button class="btn btn-primary" type="button" disabled>'.L("wxpay_not_prepayid_button").'</button></div>';
}
$jsApiParameters = $this->getParameters($prepay_id);
$callback_url=return_url("wxpay", array(
'type' => 0,
'status' => 1
));
$callback_url_error= return_url("wxpay", array(
'type' => 0,
'status' => 0
));
//todo 部署后删除
$this->logResult("log::get_code::calback:".$callback_url."\n".$callback_url_error);
// wxjsbridge todo 调试用 alert(JSON.stringify(res));return false; 部署后删除
$jsdebug="";
if(WXPAY_DEBUG){
$jsdebug='alert(JSON.stringify(res));return false;';
}
$js = '<script language="javascript">
function jsApiCall(){WeixinJSBridge.invoke("getBrandWCPayRequest",' . $jsApiParameters . ',function(res){if(res.err_msg == "get_brand_wcpay_request:ok"){location.href="'
. $callback_url . '"}else{'.$jsdebug.'location.href="' . $callback_url_error. '"}});}function callpay(){if (typeof WeixinJSBridge == "undefined"){if( document.addEventListener ){document.addEventListener("WeixinJSBridgeReady", jsApiCall, false);}else if (document.attachEvent){document.attachEvent("WeixinJSBridgeReady", jsApiCall);document.attachEvent("onWeixinJSBridgeReady", jsApiCall);}}else{jsApiCall();}}
</script>';
$button = '<div style="text-align:center"><button class="btn btn-primary" type="button" onclick="callpay()">'.L("wxpay_button").'</button></div>' . $js;
return $button;
}
function logResult($word = '',$var=array()) {
if(!WXPAY_DEBUG){
return true;
}
$output= strftime("%Y%m%d %H:%M:%S", time()) . "\n" ;
$output .= $word."\n" ;
if(!empty($var)){
$output .= print_r($var, true)."\n";
}
$output.="\n";
$log_path=ROOT_PATH . "/data/log/";
if(!is_dir($log_path)){
@mkdir($log_path, 0777, true);
}
file_put_contents($log_path."wx.txt", $output, FILE_APPEND | LOCK_EX);
}
/**
* 响应操作
*/
function callback($data)
{
if ($data['status'] == 1) {
return true;
} else {
return false;
}
}
/**
* 响应操作
*/
function notify($data) {
$this->logResult("log::notify::start:");
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
if (! empty($xml)) {
$payment = model('Payment')->get_payment($data['code']);
$this->payment=$payment;
$postdata =$this->xmlToArray($xml);
/* 检查插件文件是否存在,如果存在则验证支付是否成功,否则则返回失败信息 */
//todo 部署后删除
$this->logResult("log::notify::postdata",$postdata);
// 微信端签名
$wxsign = $postdata['sign'];
unset($postdata['sign']);
//todo 部署后删除
$this->logResult("log::notify::wxsign",$wxsign);
$sign=$this->getSign($postdata);
//todo 部署后删除
$this->logResult("log::notify::sign:",$sign);
if ($wxsign == $sign) {
// 交易成功
if ($postdata['result_code'] == 'SUCCESS') {
// 获取log_id
$out_trade_no = explode('O', $postdata['out_trade_no']);
$order_sn = $out_trade_no[1]; // 订单号log_id
// 改变订单状态
//todo 部署后删除
$this->logResult("log::notify::out_trade_no:",$postdata['out_trade_no']);
model('Payment')->order_paid($order_sn, 2);
}
$returndata['return_code'] = 'SUCCESS';
} else {
$returndata['return_code'] = 'FAIL';