// +----------------------------------------------------------------------
namespace app\appapi\controller;
use cmf\controller\HomeBaseController;
use think\facade\Db;
use think\db\Query;
/**
* 支付回调
*/
class VipbackController extends HomebaseController {
private $wxDate = null;
//支付宝 回调
public function notify_ali() {
$configpri=getConfigPri();
require_once(CMF_ROOT."sdk/alipay/alipay_app/alipay.config.php");
$alipay_config['partner'] = $configpri['aliapp_partner'];
require_once(CMF_ROOT."sdk/alipay/alipay_app/lib/alipay_core.function.php");
require_once(CMF_ROOT."sdk/alipay/alipay_app/lib/alipay_rsa.function.php");
require_once(CMF_ROOT."sdk/alipay/alipay_app/lib/alipay_notify.class.php");
//计算得出通知验证结果
$alipayNotify = new \AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();
$this->logali_vip("ali_data:".json_encode($_POST));
if($verify_result) {//验证成功
//商户订单号
$out_trade_no = $_POST['out_trade_no'];
//支付宝交易号
$trade_no = $_POST['trade_no'];
//交易状态
$trade_status = $_POST['trade_status'];
//交易金额
$total_fee = $_POST['total_fee'];
if($_POST['trade_status'] == 'TRADE_FINISHED') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
//注意:
//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
}else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
//注意:
//付款完成后,支付宝系统发送该交易状态通知
//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
$orderinfo=Db::name("user_vip_charge")->where("orderno='{$out_trade_no}' and money='{$total_fee}' and status='0' and type='1'")->find();
$this->logali_vip("orderinfo:".json_encode($orderinfo));
if($orderinfo){
$now=time();
//更新用户vip信息
$vipinfo=getUserVipInfo($orderinfo['touid']);
$days=$orderinfo['days']*24*60*60;
if($vipinfo['isvip']==0){ //用户不是vip
$endtime=$now+$days;
}else{
$endtime=Db::name("user")->where("id='{$orderinfo['touid']}'")->value("vip_endtime");
$endtime=$endtime+$days;
}
//更新用户vip信息
Db::name("user")->where("id='{$orderinfo['touid']}'")->update(array("vip_endtime"=>$endtime));
// 更新订单状态
Db::name("user_vip_charge")->where("id='{$orderinfo['id']}'")->update(array("status"=>1,"trade_no"=>$trade_no));
$this->logali_vip("成功");
echo "success"; //请不要修改或删除
return;
}else{
$this->logali_vip("orderno:".$out_trade_no.' 订单信息不存在');
}
}
//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
echo "fail"; //请不要修改或删除
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}else {
$this->logali_vip("验证失败");
//验证失败
echo "fail";
//调试用,写文本函数记录程序运行情况是否正常
//logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
}
}
/* 支付宝支付 */
/* 微信支付 */
public function notify_wx(){
$config=getConfigPri();
//$xmlInfo = $GLOBALS['HTTP_RAW_POST_DATA'];
$xmlInfo=file_get_contents("php://input");
//解析xml
$arrayInfo = $this -> xmlToArray($xmlInfo);
$this -> wxDate = $arrayInfo;
//$this -> logawx_vip("wx_data:".json_encode($arrayInfo));//log打印保存
if($arrayInfo['return_code'] == "SUCCESS"){
// if($return_msg != null){
// echo $this -> returnInfo("FAIL","签名失败");
// $this -> logawx_vip("签名失败:".$sign);//log打印保存
// return;
// }else{
$wxSign = $arrayInfo['sign'];
unset($arrayInfo['sign']);
$arrayInfo['appid'] = $config['wx_appid'];
$arrayInfo['mch_id'] = $config['wx_mchid'];
$key = $config['wx_key'];
ksort($arrayInfo);//按照字典排序参数数组
$sign = $this -> sign($arrayInfo,$key);//生成签名
$this -> logawx_vip("数据打印测试签名signmy:".$sign.":::微信sign:".$wxSign);//log打印保存
if($this -> checkSign($wxSign,$sign)){
echo $this -> returnInfo("SUCCESS","OK");
$this -> logawx_vip("签名验证结果成功:".$sign);//log打印保存
$this -> orderServer();//订单处理业务逻辑
return;
}else{
echo $this -> returnInfo("FAIL","签名失败");
$this -> logawx_vip("签名验证结果失败:本地加密:".$sign.':::::三方加密'.$wxSign);//log打印保存
return;
}
//}
}else{
echo $this -> returnInfo("FAIL","签名失败");
$this -> logawx_vip($arrayInfo['return_code']);//log打印保存
return;
}
}
private function returnInfo($type,$msg){
if($type == "SUCCESS"){
return $returnXml = "";
}else{
return $returnXml = "";
}
}
//签名验证
private function checkSign($sign1,$sign2){
return trim($sign1) == trim($sign2);
}
/* 订单查询加值业务处理
* @param orderNum 订单号
*/
private function orderServer(){
$info = $this -> wxDate;
$this->logawx_vip("info:".json_encode($info));
$orderinfo=Db::name("user_vip_charge")->where("orderno='{$info['out_trade_no']}' and status='0' and type='2'")->find();
//$this->logawx_vip("sql:".M()->getLastSql());
$this->logawx_vip("orderinfo:".json_encode($orderinfo));
if($orderinfo){
$now=time();
//更新用户vip信息
$vipinfo=getUserVipInfo($orderinfo['touid']);
$days=$orderinfo['days']*24*60*60;
if($vipinfo['isvip']==0){ //用户不是vip
$endtime=$now+$days;
}else{
$endtime=Db::name("user")->where("id='{$orderinfo['touid']}'")->value("vip_endtime");
$endtime=$endtime+$days;
}
//更新用户vip信息
Db::name("user")->where("id='{$orderinfo['touid']}'")->update(array("vip_endtime"=>$endtime));
/* 更新 订单状态 */
Db::name("user_vip_charge")->where("id='{$orderinfo['id']}'")->update(array("status"=>1,"trade_no"=>$info['transaction_id']));
}else{
$this->logawx_vip("orderno:".$out_trade_no.' 订单信息不存在');
return false;
}
}
/**
* sign拼装获取
*/
private function sign($param,$key){
$sign = "";
foreach($param as $k => $v){
$sign .= $k."=".$v."&";
}
$sign .= "key=".$key;
$sign = strtoupper(md5($sign));
return $sign;
}
/**
* xml转为数组
*/
private function xmlToArray($xmlStr){
$msg = array();
$postStr = $xmlStr;
$msg = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
return $msg;
}
/* 微信支付 */
/* 苹果支付 */
public function notify_ios(){
$content=file_get_contents("php://input");
$data = json_decode($content,true);
$receipt = $data["receipt-data"];
$version_ios = $data["version_ios"];
$out_trade_no = $data["out_trade_no"];
$info = $this->getReceiptData($receipt, $version_ios);
$this->logios_vip("info:".json_encode($info));
$iforderinfo=Db::name("user_vip_charge")->where("trade_no='{$info['transaction_id']}' and type='3'")->find();
if($iforderinfo){
echo '{"status":"fail","info":"非法提交-001"}';return;
}
//判断订单是否存在
$orderinfo=Db::name("user_vip_charge")->where("orderno='{$out_trade_no}' and status='0' and type='3'")->find();
if($orderinfo){
$now=time();
//更新用户vip信息
$vipinfo=getUserVipInfo($orderinfo['touid']);
$days=$orderinfo['days']*24*60*60;
if($vipinfo['isvip']==0){ //用户不是vip
$endtime=$now+$days;
}else{
$endtime=Db::name("user")->where("id='{$orderinfo['touid']}'")->value("vip_endtime");
$endtime=$endtime+$days;
}
//更新用户vip信息
Db::name("user")->where("id='{$orderinfo['touid']}'")->update(array("vip_endtime"=>$endtime));
/* 更新 订单状态 */
Db::name("user_vip_charge")->where("id='{$orderinfo['id']}'")->update(array("status"=>1,"trade_no"=>$info['transaction_id']));
}else{
$this->logios_vip("orderno:".$out_trade_no.' 订单信息不存在');
echo '{"status":"fail","info":"订单信息不存在-003"}';
return;
}
echo '{"status":"success","info":"充值支付成功"}';
}
public function getReceiptData($receipt, $version_ios){
$config=getConfigPub();
if ($version_ios == $config['ios_shelves']) {
//沙盒
$endpoint = 'https://sandbox.itunes.apple.com/verifyReceipt';
}else {
//生产
$endpoint = 'https://buy.itunes.apple.com/verifyReceipt';
}
$postData = json_encode(
array('receipt-data' => $receipt)
);
$ch = curl_init($endpoint);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //关闭安全验证
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //关闭安全验证
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
$response = curl_exec($ch);
$errno = curl_errno($ch);
$errmsg = curl_error($ch);
curl_close($ch);
if($errno != 0) {
echo '{"status":"fail","info":"服务器出错,请联系管理员"}';
return;
}
$data = json_decode($response,1);
if (!is_array($data)) {
echo '{"status":"fail","info":"验证失败,如有疑问请联系管理"}';
return;
}
if (!isset($data['status']) || $data['status'] != 0) {
echo '{"status":"fail","info":"验证失败,如有疑问请联系管理"}';
return;
}
return array(
'product_id' => $data['receipt']['in_app'][0]['product_id'],
'transaction_id' => $data['receipt']['in_app'][0]['transaction_id'],
);
}
/* 苹果支付 */
/* 打印log */
public function logali_vip($msg){
file_put_contents(CMF_ROOT.'data/log/vipback/logali_vip'.date('Y-m-d').'.txt',date('y-m-d h:i:s').' msg:'.$msg."\r\n",FILE_APPEND);
}
/* 打印log */
public function logawx_vip($msg){
file_put_contents(CMF_ROOT.'data/log/vipback/logwx_vip'.date('Y-m-d').'.txt',date('y-m-d h:i:s').' msg:'.$msg."\r\n",FILE_APPEND);
}
/* 打印log */
public function logios_vip($msg){
file_put_contents(CMF_ROOT.'data/log/vipback/logios_vip'.date('Y-m-d').'.txt',date('y-m-d h:i:s').' msg:'.$msg."\r\n",FILE_APPEND);
}
}