123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 |
- <?php
- namespace app\api\controller;
- use app\common\controller\Api;
- use think\Db;
- use bsn\Bsn;
- use app\common\library\Sms as Smslib;
- /**
- * 支付回调
- */
- class Sandpay extends Api
- {
- protected $noNeedLogin = ['*'];
- protected $noNeedRight = ['*'];
- //protected $nofify_file = '../runtime/notify.txt';
- /*public function __construct(){
- $log_base_dir = '../paylog/';
- if (!is_dir($log_base_dir))
- {
- mkdir($log_base_dir, 0770, true);
- @chmod($log_base_dir, 0770);
- }
- $notify_file = $log_base_dir.'sandpay_notify.txt';
- if(!file_exists($notify_file)) {
- @touch($notify_file);
- @chmod($notify_file, 0770);
- }
- if(filesize($notify_file)>5242880)//大于5M自动切换
- {
- rename($notify_file, $log_base_dir.'sandpay_notify_'.date('Y_m_d_H_i_s').'.txt');
- }
- if(!file_exists($notify_file)) {
- @touch($notify_file);
- @chmod($notify_file, 0770);
- }
- }*/
- //vip用的,创建订单废弃
- public function sand_vip_recharge(){
- $rc_id = input('rc_id',0);
- $pay_type = input('pay_type','wechat');
- $uid = $this->auth->id;
- if(!$rc_id){
- $this->error('请选择会员套餐');
- }
- //赋值money
- $recharge_config = Db::name('payvip_config')->where('id',$rc_id)->find();
- $money = $recharge_config['money'];
- if($money<=0)
- {
- $this->error('支付金额必须大于0');
- }
- if($money > 10000){
- $this->error('支付金额太大');
- }
- //会员等级冲突
- //当前是会员,但是却要向下级续费,直接提示报错
- //修改等级,向上立刻改,向下不允许
- $wallet_info = model('wallet')->getWallet($this->auth->id);
- if($wallet_info['vip_endtime'] > time() && $recharge_config['vip_level'] < $wallet_info['vip_level']){
- $this->error('当前会员没有过期,不能续费');
- }
- //创建订单
- $data = [];
- $data['status'] = 0;
- $pay_no = createUniqueNo('V',$uid);
- $data['pay_no'] = $pay_no;
- $data['money'] = $money;
- $data['payment_class'] = $pay_type;
- $data['user_id'] = $uid;
- $data['ext_info'] = json_encode(['subject'=>'充值vip支付']);
- $data['memo'] = '充值会员支付';
- $data['createtime'] = time();
- //$data['payment'] = 'miniapp';
- $data['payment'] = 'app';
- $orderid = Db::name('pay_order')->insertGetId($data);
- //创建回调
- $even_data = [];
- $even_data['event'] = 'success';
- $even_data['class'] = 'app\common\model\Recharge';
- $even_data['method'] = 'sandvippaysucc';
- $even_data['args'] = json_encode(['user_id'=>$uid,'days'=>$recharge_config['days'],'vip_level'=>$recharge_config['vip_level'],'gold_num'=>$recharge_config['gold_num'],'money'=>$money]);
- $even_data['pay_no'] = $pay_no;
- Db::name('pay_event')->insertGetId($even_data);
- //下单
- $sandpay = new \app\common\library\Sandpay();
- $sandpayParams = [
- 'order_no' => $pay_no,//订单号
- 'goods_name' => '充值会员',//商品名称
- 'money' => $money,//金额
- 'type' => 'vip',//会员
- ];
- $res = $sandpay->wechat($sandpayParams);
- if ($res['status'] == 1) {
- $this->success('成功', $res['data']);
- }else {
- $this->error('失败', $res['data']);
- }
- }
- //充值金币 创建订单废弃
- public function sand_gold_recharge(){
- $rc_id = input_post('rc_id',0);
- $pay_type = input_post('pay_type','wechat');
- $freemoney = input_post('freemoney', 0, 'intval');
- $uid = $this->auth->id;
- if(!$rc_id && !$freemoney){
- $this->error('请选择或填写充值金额');
- }
- // if(!$rc_id){
- // $this->error('请选择充值金额');
- // }
- //赋值money
- if($rc_id){
- $recharge_config = Db::name('paygold_config')->where('id',$rc_id)->find();
- $money = $recharge_config ? $recharge_config['money']: 0;
- $gold = $recharge_config ? $recharge_config['gold'] : 0;
- $first_gold = $recharge_config ? $recharge_config['first_gold'] : 0;
- $first_vipdays = $recharge_config ? $recharge_config['first_vipdays'] : 0;
- $vip_gold = $recharge_config ? $recharge_config['vip_gold'] : 0;
- }
- //自由输入覆盖
- if(!empty($freemoney)){
- $rc_id = 0;
- $money = floatval($freemoney);
- $bili = config('site.money_to_gold') ?: 10;
- $gold = bcmul($money,$bili,0);
- $first_gold = 0;
- $first_vipdays = 0;
- $vip_gold = 0;
- }
- //
- if($money<=0)
- {
- $this->error('支付金额必须大于0');
- }
- if($money > 10000){
- $this->error('支付金额太大');
- }
- //查询是不是会员,若不是则不赠送金币
- $vip_endtime = Db::name('user_wallet')->where('user_id',$this->auth->id)->value('vip_endtime');
- if ($vip_endtime < time()) {
- $vip_gold = 0;
- }
- //创建订单
- $data = [];
- $data['status'] = 0;
- $pay_no = createUniqueNo('P',$uid);
- $data['pay_no'] = $pay_no;
- $data['money'] = $money;
- $data['payment_class'] = $pay_type;
- $data['user_id'] = $uid;
- $data['ext_info'] = json_encode(['subject'=>'充值金币支付']);
- $data['memo'] = '充值金币支付';
- $data['createtime'] = time();
- $data['payment'] = 'app';
- $orderid = Db::name('pay_order')->insertGetId($data);
- //创建回调
- $even_data = [];
- $even_data['event'] = 'success';
- $even_data['class'] = 'app\common\model\Recharge';
- $even_data['method'] = 'sandgoldpaysucc';
- $even_data['args'] = json_encode(['user_id'=>$uid,'gold'=>$gold,'money'=>$money,'pg_id'=>$rc_id,'first_gold'=>$first_gold,'first_vipdays'=>$first_vipdays, 'intro_uid' => $this->auth->intro_uid, 'vip_gold' => $vip_gold]);
- $even_data['pay_no'] = $pay_no;
- Db::name('pay_event')->insertGetId($even_data);
- //下单
- $sandpay = new \app\common\library\Sandpay();
- $sandpayParams = [
- 'order_no' => $pay_no,//订单号
- 'goods_name' => '充值金币',//商品名称
- 'money' => $money,//金额
- 'type' => 'gold',//充值
- ];
- $res = $sandpay->wechat($sandpayParams);
- if ($res['status'] == 1) {
- $this->success('成功', $res['data']);
- }else {
- $this->error('失败', $res['data']);
- }
- }
- /**
- * 支付成功(插件)
- */
- public function notify()
- {
- //$input_post_data = json_encode($_POST);
- //filePut('[wallet][paySucc]充值参数 recharge money post'.$input_post_data);
- $postData = isset($_POST['data']) ? $_POST['data'] : [];
- $sign = isset($_POST['sign']) ? $_POST['sign'] : '';
- filePut('[wallet][paySucc]充值参数 recharge money data:'.$postData."\n".' sign:'.$sign);
- /*$dataArr = [
- "head"=>[
- "version"=>"1.0",
- "respTime"=>"20230913093602",
- "respCode"=>"000000",
- "respMsg"=>"成功",
- ],
- "body"=>[
- "mid"=>"6888806122762",
- "orderCode"=>"P23091309351693000123",
- "tradeNo"=>"P23091309351693000123",
- "clearDate"=>"20230913",
- "totalAmount"=>"000000000001",
- "orderStatus"=>"1",
- "payTime"=>"20230913093602",
- "settleAmount"=>"000000000001",
- "buyerPayAmount"=>"000000000001",
- "discAmount"=>"000000000000",
- "txnCompleteTime"=>"20230913093601",
- "payOrderCode"=>"20230913001224810000000000018593",
- "accLogonNo"=>"odk6K6wzq1m0sKwDD98Vv0xzYsIo",
- "accNo"=>"",
- "midFee"=>"000000000000",
- "extraFee"=>"000000000000",
- "specialFee"=>"000000000000",
- "plMidFee"=>"000000000000",
- "bankserial"=>"4200001938202309134493832643",
- "externalProductCode"=>"00002021",
- "cardNo"=>"",
- "creditFlag"=>"",
- "bid"=>"",
- "benefitAmount"=>"000000000000",
- "remittanceCode"=>"",
- "respTime"=>"20230912141303",
- "extend"=>[
- "type" => "gold",
- ]
- ],
- ];
- $data = ["extend"=>"",
- "charset"=>"UTF-8",
- "data"=>$dataArr,
- "sign"=>"hoCYCLfEmbHjoXg8KHLYU+TCwAh8HrilFUfk7x9GoXAHidKRGu+\/5CkUlC1AqY0OeD3EJKu3ckyqLFUZF4G5PbzFbV27DYNeaRNnbU8htmwCV06a9SgOumv79EJGZ78x2FmNcPL8xu8IhPoOzorLtG5uIifSbsPK4283X09ikb8wTeNFGMMEy+MioftEoOv892kFs5wbNaazJNp8IdAjRwB5wYeMJc28hfnSQfg9SsR5zpqTsMkbiQoybyVdF8msWjlXC1TD5+y33zj77If\/bOK5obSUCrdHZt7S3V5bN2HqyNtFPEK3Ipn2p\/lu3yyo9fFKC5WtgO8G20OVYCu7dQ==",
- "signType"=>"01",
- ];
- $plainText = json_encode($dataArr);*/
- //$plainText = '{"extend":"","charset":"UTF-8","data":"{\"head\":{\"version\":\"1.0\",\"respTime\":\"20230913093602\",\"respCode\":\"000000\",\"respMsg\":\"\u6210\u529f\"},\"body\":{\"mid\":\"6888806122762\",\"orderCode\":\"P23091309351693000123\",\"tradeNo\":\"P23091309351693000123\",\"clearDate\":\"20230913\",\"totalAmount\":\"000000000001\",\"orderStatus\":\"1\",\"payTime\":\"20230913093602\",\"settleAmount\":\"000000000001\",\"buyerPayAmount\":\"000000000001\",\"discAmount\":\"000000000000\",\"txnCompleteTime\":\"20230913093601\",\"payOrderCode\":\"20230913001224810000000000018593\",\"accLogonNo\":\"odk6K6wzq1m0sKwDD98Vv0xzYsIo\",\"accNo\":\"\",\"midFee\":\"000000000000\",\"extraFee\":\"000000000000\",\"specialFee\":\"000000000000\",\"plMidFee\":\"000000000000\",\"bankserial\":\"4200001938202309134493832643\",\"externalProductCode\":\"00002021\",\"cardNo\":\"\",\"creditFlag\":\"\",\"bid\":\"\",\"benefitAmount\":\"000000000000\",\"remittanceCode\":\"\",\"extend\":\"{\\\"type\\\":\\\"gold\\\"}\"}}","sign":"hoCYCLfEmbHjoXg8KHLYU+TCwAh8HrilFUfk7x9GoXAHidKRGu+\/5CkUlC1AqY0OeD3EJKu3ckyqLFUZF4G5PbzFbV27DYNeaRNnbU8htmwCV06a9SgOumv79EJGZ78x2FmNcPL8xu8IhPoOzorLtG5uIifSbsPK4283X09ikb8wTeNFGMMEy+MioftEoOv892kFs5wbNaazJNp8IdAjRwB5wYeMJc28hfnSQfg9SsR5zpqTsMkbiQoybyVdF8msWjlXC1TD5+y33zj77If\/bOK5obSUCrdHZt7S3V5bN2HqyNtFPEK3Ipn2p\/lu3yyo9fFKC5WtgO8G20OVYCu7dQ==","signType":"01"}';
- //echo '<pre>';var_dump($plainText);exit;
- //提取数据
- $plainText = $postData;
- $dataArray = json_decode($postData,true);
- $head = isset($dataArray['head']) ? $dataArray['head'] : [];
- $body = isset($dataArray['body']) ? $dataArray['body'] : [];
- $respCode = isset($head['respCode']) ? $head['respCode'] : '000001';
- $orderStatus = isset($body['orderStatus']) ? $body['orderStatus'] : '0';
- $orderCode = isset($body['orderCode']) ? $body['orderCode'] : '';
- $extend = isset($body['extend']) ? $body['extend'] : '';
- $extendType = '';
- if (!empty($extend)) {
- $extendArr = json_decode($extend,true);
- $extendType = isset($extendArr['type']) ? $extendArr['type'] : '';
- }
- //验签 1是正确
- $sandpay = new \app\common\library\Sandpay();
- /*$plainText = '{"head":{"version":"1.0","respTime":"20230913110455","respCode":"000000","respMsg":"成功"},"body":{"mid":"6888806122762","orderCode":"P23091311040769547523","tradeNo":"P23091311040769547523","clearDate":"20230913","totalAmount":"000000000001","orderStatus":"1","payTime":"20230913110455","settleAmount":"000000000001","buyerPayAmount":"000000000001","discAmount":"000000000000","txnCompleteTime":"20230913110455","payOrderCode":"20230913001241710000000000029923","accLogonNo":"odk6K6wzq1m0sKwDD98Vv0xzYsIo","accNo":"","midFee":"000000000000","extraFee":"000000000000","specialFee":"000000000000","plMidFee":"000000000000","bankserial":"4200001942202309131368220541","externalProductCode":"00002021","cardNo":"","creditFlag":"","bid":"","benefitAmount":"000000000000","remittanceCode":"","extend":"{\"type\":\"gold\"}"}}';
- $sign = 'Vs2JTo57FwdeT78Lxi7Sgj3XLw48+XxUZblSpVnAQkpgvPqai3m4rkobG8hfuUnYCU/yXxDbYU8hEEfc9rDryT5sFPmmTYjOISJnc6jNDBs6SpeDQhAvnpiiXgZ3/hDWp8ehsgPJbHv5nqlbzLsJM1+WhfW86sfJt70oMiffQ5v9G192zerJWXF3jL9dyLM0WmG2icr9qHz12ZPFyYYonUWRIVc+jcZ0R0qrHD7wAPx+JzbK9crXnTWu1lHjOwcVUrYtMcVDv84wSxl8NnofNUCSMSxVSYHh8ZvgPis7WtgwBcy9XfD30Jux/a/V5oIbN+7yzTlEBIL9pHZb31O4fg==';*/
- $encrypt_str = $sandpay->verify($plainText, $sign);
- if($encrypt_str != 1){
- filePut('[wallet][paySucc]充值入账更新余额失败 recharge money fail'.$orderCode."\n".' data:'.$postData."\n".' sign:'.$sign);
- echo 'Fail';exit;
- }
- //状态验证
- if($respCode != '000000'){
- filePut('[wallet][paySucc]验证回调状态失败 respCode'.$orderCode);
- echo 'Fail';exit;
- }
- if($orderStatus != '1'){
- filePut('[wallet][paySucc]验证回调订单状态 recharge money fail orderStatus'.$orderCode);
- echo 'Fail';exit;
- }
- //查询订单信息
- $PayResult = Db::name('pay_order');
- $where['pay_no'] = $orderCode;
- $order_info = $PayResult->where($where)->find();
- if ($order_info['status'] == 1) {
- filePut('[wallet][paySucc]充值入账更新余额失败 recharge money fail status已更新过'.$orderCode);
- echo 'respCode=000000';exit;
- }
- //构建支付订单处理结果信息
- //$_data['transaction_id'] = isset($data['body']['payOrderCode']) ? $data['body']['payOrderCode'] : ''; //因为文档说不一定有,所以不填了
- $_data['status'] = 2;
- $result = $PayResult->where($where)->setField($_data);
- if ($result || 1) {
- //你可以在此编写订单逻辑
- $payEventWhere['pay_no'] = $orderCode;
- $payEvent = Db::name('pay_event')->where($payEventWhere)->find();
- $args = isset($payEvent['args']) ? $payEvent['args'] : '';
- $args = json_decode($args,true);
- $rechargeM = new \app\common\model\Recharge();
- if ($extendType == 'gold') {
- $payRes = $rechargeM->goldpaysucc($orderCode,$args);
- $payTypeStr = '充值';
- } elseif($extendType == 'vip') {
- $payRes = $rechargeM->vippaysucc($orderCode,$args);
- $payTypeStr = 'vip';
- } else {
- $payRes = false;
- $payTypeStr = '未知支付类型';
- }
- if(!$payRes){
- filePut('[wallet][paySucc]'.$payTypeStr.'更新失败请查看问题'.$orderCode);
- exit;
- }
- filePut('[wallet][paySucc]回调成功'.$orderCode);
- echo 'respCode=000000';exit;
- }
- }
- }
|