ywtc_api/application/api/controller/Wxpaynotify.php

248 lines
10 KiB
PHP

<?php
namespace app\api\controller;
use think\Db;
use \think\Loader;
use think\helper\Hash;
use Qrcode\Compress;
use EasyWeChat\Factory;
use app\api\controller\SendMail;
use app\member\model\Member as MemberModel;
use app\member\model\MemberServiceOrder as MemberServiceOrderModel;
use app\member\model\MemberBalanceLogs as MemberBalanceLogsModel;
use app\activity\model\MoneyTree as MoneyTreeModel;
use app\activity\model\MoneyTreeLogs as MMoneyTreeLogsModel;
/**
* 微信支付回调接口
* @package app\api\controller
*/
class Wxpaynotify extends Api{
//初始化
public function initialize(){
parent::initialize();
}
/**
* 微信支付异步回调
* @author loomis<2477365162@qq.com>
*/
public function index(){
$config = [
// 必要配置
'app_id' => config('smallprogram_appid'),
'mch_id' => config('wxpay_mchid'),
'key' => config('wxpay_paykey'), // API v2 密钥 (注意: 是v2密钥 是v2密钥 是v2密钥)
// 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书)
'cert_path' => get_file_path(config('wxpay_appclient_cert')), // XXX: 绝对路径!!!!
'key_path' => get_file_path(config('wxpay_appclient_key')), // XXX: 绝对路径!!!!
];
$app = Factory::payment($config);
$response = $app->handlePaidNotify(function ($message, $fail) {
// 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单
$ordernum = $message['out_trade_no'];
$order = MemberServiceOrderModel::where(['ordernum'=>$ordernum])->find();
if (!$order || $order['status'] == 2) { // 如果订单不存在 或者 订单已经支付过了
return true; //已处理
}
//微信:【订单查询】接口,确认已支付
$config = [
// 必要配置
'app_id' => config('smallprogram_appid'),
'mch_id' => config('wxpay_mchid'),
'key' => config('wxpay_paykey'),
];
$app = Factory::payment($config);
$wx_res = $app->order->queryByTransactionId($message['transaction_id']);
$weixinquery = serialize($wx_res);
if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
//// 用户是否支付成功
if (array_key_exists('result_code', $message) && $message['result_code'] === 'SUCCESS') {
//更新订单状态
$orderinfo = MemberServiceOrderModel::where(['ordernum'=>$ordernum,'status'=>1])->find();
if (!$orderinfo){
return true;
}
if ($orderinfo['status'] != 1){
return true;
}
//购买群二维码
if($orderinfo['type']==1){
//进行积分发送
$memberinfo = MemberModel::where('id',$orderinfo['uid'])->find();
if(!empty($memberinfo['invitation_uid'])){
//一级发送积分
if(!empty(config('one_integral'))){
$one_invitation_uinfo = MemberModel::where('id',$memberinfo['invitation_uid'])->find();
$points_num = $orderinfo['totalprice'] * (config('one_integral')/100);
$points_num = round($points_num);
if($points_num<=0){
$points_num = 1;
}
MemberModel::where('id',$memberinfo['invitation_uid'])->setInc('balance',$points_num);
//插入积分记录、
MemberBalanceLogsModel::addGetLog($memberinfo['invitation_uid'],1,$points_num,$orderinfo['ordernum'],'一级分销反馈积分',$orderinfo['uid']);
//二级发送积分
if(!empty($one_invitation_uinfo['invitation_uid']) && !empty(config('two_integral'))){
$two_points_num = $orderinfo['totalprice'] * (config('two_integral')/100);
$two_points_num = round($two_points_num);
if($two_points_num<=0){
$two_points_num = 1;
}
MemberModel::where('id',$one_invitation_uinfo['invitation_uid'])->setInc('balance',$two_points_num);
//插入积分记录、
MemberBalanceLogsModel::addGetLog($one_invitation_uinfo['invitation_uid'],1,$two_points_num,$orderinfo['ordernum'],'二级分销反馈积分',$orderinfo['uid']);
}
}
}
}
//积分充值
if($orderinfo['type']==2){
//充值成功,给用户增加积分
MemberModel::where('id',$orderinfo['uid'])->setInc('balance',intval($orderinfo['service_title']));
//插入积分记录、
MemberBalanceLogsModel::addGetLog($orderinfo['uid'],1,intval($orderinfo['service_title']),$orderinfo['ordernum'],'用户充值积分');
}
//购买vip
if($orderinfo['type']==3){
MemberModel::where('id',$orderinfo['uid'])->update([
'vip_id'=>$orderinfo['service_thumb'],
'vip_title'=>$orderinfo['service_title'],
]);
}
$res = MemberServiceOrderModel::where(['ordernum'=>$ordernum])->update([
'status'=>2,
'update_time'=>time(),
'pay_time'=>time(),
'pay_data' =>$weixinquery,
]);
} elseif (array_key_exists('result_code', $message) && $message['result_code'] === 'FAIL') {
// 用户支付失败
return $fail('通信失败,请稍后再通知我');
}
} else {
return $fail('通信失败,请稍后再通知我');
}
return true; // 返回处理完成
});
$response->send();
}
//取消超时未支付的订单
public function cancelorder(){
$where = [];
$where[] = ['timeout_time','elt',time()];
$where[] = ['status','eq',1];
if(empty(MemberServiceOrderModel::where($where)->count())){
return 'ok';
}
$res = MemberServiceOrderModel::where($where)->update(['status'=>3]);
if($res){
return 'ok';
}else{
return 'fail';
}
}
//用户协议
public function useragreement(){
$useragreementmsg = config('useragreement');
//商品详情
$strs = 'https://'.$_SERVER['HTTP_HOST'].'/uploads/';
$useragreementmsg= str_replace("/uploads/", $strs, $useragreementmsg);
return json(['code' => 200, 'msg' => '查询成功','result'=>$useragreementmsg]);
}
//隐私政策
public function privacypolicy(){
$useragreementmsg = config('privacypolicy');
//商品详情
$strs = 'https://'.$_SERVER['HTTP_HOST'].'/uploads/';
$useragreementmsg= str_replace("/uploads/", $strs, $useragreementmsg);
return json(['code' => 200, 'msg' => '查询成功','result'=>$useragreementmsg]);
}
//摇钱树产生金币
public function moneytree(){
$userlist = MemberModel::where('is_delete',0)->select();
if(!empty($userlist)){
foreach ($userlist as $k=>$v){
//存在未领取金币用户不持续产生金币
$wlqjinbi = MMoneyTreeLogsModel::where(['uid'=>$v['id'],'status'=>1])->count();
if(!empty($wlqjinbi)){
continue;
}
//无邀请用户的用户不产生金币
$invitation_num = MemberModel::where(['invitation_uid'=>$v['id'],'is_delete'=>0])->count();
if(empty($invitation_num)){
continue;
}
//根据用户分享人数,获得对应积分
$integral_num = MoneyTreeModel::getintegralnum($invitation_num);
//根据用户分享人数,获得摇钱树等级
$tree_grade = MoneyTreeModel::gettreegrade($invitation_num);
if(empty($integral_num) || empty($tree_grade)){
continue;
}
$is_generate = 0;
$create_time = MMoneyTreeLogsModel::where(['uid'=>$v['id']])->order('create_time desc')->value('create_time');
if(!empty($create_time)){
$create_time = $create_time + 86400;
if($create_time<=time()){
$is_generate = 1;
}
}else{
$is_generate = 1;
}
if($is_generate==1){
MMoneyTreeLogsModel::create([
'uid'=>$v['id'],
'tree_grade'=>$tree_grade,
'integral_num'=>$integral_num,
'create_time'=>time(),
'update_time'=>time(),
]);
}
}
}
echo 'ok';
}
}