248 lines
10 KiB
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';
|
|
}
|
|
}
|