| <?php
|
|
|
| class fuiou_plugin
|
| {
|
| static public $info = [
|
| 'name' => 'fuiou',
|
| 'showname' => '富友支付(前置商户)',
|
| 'author' => '富友',
|
| 'link' => 'https://www.fuiou.com/',
|
| 'types' => ['alipay','wxpay','bank'],
|
| 'inputs' => [
|
| 'appid' => [
|
| 'name' => '商户号',
|
| 'type' => 'input',
|
| 'note' => '',
|
| ],
|
| 'appkey' => [
|
| 'name' => '商户密钥',
|
| 'type' => 'input',
|
| 'note' => '',
|
| ],
|
| 'appurl' => [
|
| 'name' => '订单号前缀',
|
| 'type' => 'input',
|
| 'note' => '',
|
| ],
|
| ],
|
| 'select' => null,
|
| 'note' => '',
|
| 'bindwxmp' => false,
|
| 'bindwxa' => false,
|
| ];
|
|
|
| static public function submit(){
|
| global $siteurl, $channel, $order, $sitename;
|
|
|
| return ['type'=>'jump','url'=>'/pay/'.$order['typename'].'/'.TRADE_NO.'/'];
|
| }
|
|
|
| static public function mapi(){
|
| global $siteurl, $channel, $order, $device, $mdevice;
|
|
|
| $typename = $order['typename'];
|
| return self::$typename();
|
| }
|
|
|
|
|
| static private function addOrder($pay_type){
|
| global $siteurl, $channel, $order, $ordername, $clientip, $conf;
|
|
|
| $apiurl = 'https://aipay.fuioupay.com/aggregatePay/preCreate';
|
| $param = [
|
| 'version' => '1.0',
|
| 'mchnt_cd' => $channel['appid'],
|
| 'random_str' => random(32),
|
| 'order_type' => $pay_type,
|
| 'order_amt' => strval($order['realmoney']*100),
|
| 'mchnt_order_no' => $channel['appurl'].TRADE_NO,
|
| 'txn_begin_ts' => date('YmdHis'),
|
| 'goods_des' => $ordername,
|
| 'term_id' => rand(10000000,99999999).'',
|
| 'term_ip' => $clientip,
|
| 'notify_url' => $conf['localurl'].'pay/notify/'.TRADE_NO.'/',
|
| ];
|
|
|
| $param_ord = ['mchnt_cd', 'order_type', 'order_amt', 'mchnt_order_no', 'txn_begin_ts', 'goods_des', 'term_id', 'term_ip', 'notify_url', 'random_str', 'version'];
|
| $signStr = '';
|
| foreach($param_ord as $key){
|
| $signStr .= $param[$key] . '|';
|
| }
|
| $signStr .= $channel['appkey'];
|
| $param['sign'] = md5($signStr);
|
|
|
| return \lib\Payment::lockPayData(TRADE_NO, function() use($apiurl, $param) {
|
| $data = get_curl($apiurl, json_encode($param), 0, 0, 0, 0, 0, ['Content-Type: application/json']);
|
|
|
| $result = json_decode($data, true);
|
|
|
| if(isset($result['result_code']) && $result['result_code']=='000000'){
|
| $code_url = $result['qr_code'];
|
| }else{
|
| throw new Exception($result['result_msg']?$result['result_msg']:'返回数据解析失败');
|
| }
|
| return $code_url;
|
| });
|
| }
|
|
|
|
|
| static public function alipay(){
|
| try{
|
| $code_url = self::addOrder('ALIPAY');
|
| }catch(Exception $ex){
|
| return ['type'=>'error','msg'=>'支付宝下单失败!'.$ex->getMessage()];
|
| }
|
|
|
| return ['type'=>'qrcode','page'=>'alipay_qrcode','url'=>$code_url];
|
| }
|
|
|
|
|
| static public function wxpay(){
|
| global $siteurl, $device, $mdevice;
|
| try{
|
| $code_url = self::addOrder('WXXS');
|
| }catch(Exception $ex){
|
| return ['type'=>'error','msg'=>'微信支付下单失败!'.$ex->getMessage()];
|
| }
|
|
|
| if($mdevice == 'wechat' || strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger')!==false){
|
| return ['type'=>'jump','url'=>$code_url];
|
| } elseif (checkmobile()==true) {
|
| return ['type'=>'qrcode','page'=>'wxpay_wap','url'=>$code_url];
|
| } else {
|
| return ['type'=>'qrcode','page'=>'wxpay_qrcode','url'=>$code_url];
|
| }
|
| }
|
|
|
|
|
| static public function bank(){
|
| try{
|
| $code_url = self::addOrder('UNIONPAY');
|
| }catch(Exception $ex){
|
| return ['type'=>'error','msg'=>'银联云闪付下单失败!'.$ex->getMessage()];
|
| }
|
|
|
| return ['type'=>'qrcode','page'=>'bank_qrcode','url'=>$code_url];
|
| }
|
|
|
|
|
| static public function notify(){
|
| global $channel, $order;
|
|
|
| $json = file_get_contents('php://input');
|
|
|
| $arr = json_decode($json,true);
|
|
|
| $param_ord = ['mchnt_cd', 'mchnt_order_no', 'settle_order_amt', 'order_amt', 'txn_fin_ts', 'reserved_fy_settle_dt', 'random_str'];
|
| $signStr = '';
|
| foreach($param_ord as $key){
|
| $signStr .= $arr[$key] . '|';
|
| }
|
| $signStr .= $channel['appkey'];
|
| $sign = md5($signStr);
|
|
|
| if ($sign === $arr['sign']) {
|
| $out_trade_no = substr($arr['mchnt_order_no'],strlen($channel['appurl']));
|
| $trade_no = $arr['transaction_id'];
|
| $money = $arr['order_amt'];
|
| if($out_trade_no == TRADE_NO){
|
| processNotify($order, $trade_no);
|
| }
|
| return ['type'=>'html','data'=>'1'];
|
| }else{
|
| return ['type'=>'html','data'=>'0'];
|
| }
|
|
|
| }
|
|
|
|
|
| static public function return(){
|
| return ['type'=>'page','page'=>'return'];
|
| }
|
|
|
|
|
| static public function refund($order){
|
| global $channel;
|
| if(empty($order))exit();
|
|
|
| $apiurl = 'https://aipay.fuioupay.com/aggregatePay/commonRefund';
|
|
|
| if($order['type'] == 1) $pay_type = 'ALIPAY';
|
| else if($order['type'] == 2) $pay_type = 'WECHAT';
|
| else if($order['type'] == 4) $pay_type = 'UNIONPAY';
|
|
|
| $param = [
|
| 'version' => '1.0',
|
| 'mchnt_cd' => $channel['appid'],
|
| 'term_id' => rand(10000000,99999999).'',
|
| 'random_str' => random(32),
|
| 'mchnt_order_no' => $channel['appurl'].$order['trade_no'],
|
| 'refund_order_no' => 'REF'.$order['trade_no'],
|
| 'order_type' => $pay_type,
|
| 'total_amt' => strval($order['realmoney']*100),
|
| 'refund_amt' => strval($order['refundmoney']*100),
|
| ];
|
|
|
| $param_ord = ['mchnt_cd', 'order_type', 'mchnt_order_no', 'refund_order_no', 'total_amt', 'refund_amt', 'term_id', 'random_str', 'version'];
|
| $signStr = '';
|
| foreach($param_ord as $key){
|
| $signStr .= $param[$key] . '|';
|
| }
|
| $signStr .= $channel['appkey'];
|
| $param['sign'] = md5($signStr);
|
|
|
| $data = get_curl($apiurl, json_encode($param), 0, 0, 0, 0, 0, ['Content-Type: application/json']);
|
| $result = json_decode($data, true);
|
|
|
| if($result["result_code"]=='000000'){
|
| $result = ['code'=>0, 'trade_no'=>$result['mchnt_order_no'], 'refund_fee'=>$result['reserved_refund_amt']];
|
| }else{
|
| $result = ['code'=>-1, 'msg'=>$result["result_msg"]];
|
| }
|
| return $result;
|
| }
|
|
|
| } |