|
@@ -908,4 +908,120 @@ class PaymentService extends BaseService
|
|
|
$this->error = '退款处理成功';
|
|
$this->error = '退款处理成功';
|
|
|
return $refundStatus;
|
|
return $refundStatus;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 企业打款到零钱(商家转账)
|
|
|
|
|
+ * @param $order 订单参数:order_no-单号,pay_money-打款金额,account-打款账号(微信openid或支付宝账号),body-打款备注
|
|
|
|
|
+ * @param string $scene
|
|
|
|
|
+ * @param int $payType
|
|
|
|
|
+ * @return bool
|
|
|
|
|
+ */
|
|
|
|
|
+ public function transfer($order, $scene='withdraw', $payType=10)
|
|
|
|
|
+ {
|
|
|
|
|
+ $outTradeNo = isset($order['order_no']) && $order['order_no'] ? $order['order_no'] : get_order_num('WD');
|
|
|
|
|
+ $body = isset($order['body']) ? $order['body'] : '';
|
|
|
|
|
+ $amount = isset($order['pay_money']) ? $order['pay_money'] : 0;
|
|
|
|
|
+ $account = isset($order['account']) ? $order['account'] : ''; // 微信openid或支付宝账号
|
|
|
|
|
+ $realName = isset($order['real_name']) ? $order['real_name'] : ''; // 实名
|
|
|
|
|
+ if ($amount < 0) {
|
|
|
|
|
+ $this->error = '打款金额错误';
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if(empty($account)){
|
|
|
|
|
+ $this->error = $payType == 10? '缺少微信OPENID' : '支付宝账户不为空';
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 创建支付
|
|
|
|
|
+ $result = [];
|
|
|
|
|
+ try {
|
|
|
|
|
+ $config = ConfigService::make()->getConfigOptionByGroup(6);
|
|
|
|
|
+ if ($payType == 10) {
|
|
|
|
|
+ $appid = isset($config['wxpay_appid']) ? $config['wxpay_appid'] : '';
|
|
|
|
|
+ $payData = [
|
|
|
|
|
+ '_action' => 'mch_transfer', // 微信官方老版本下线后,此部分可省略
|
|
|
|
|
+ 'appid' => $appid,
|
|
|
|
|
+ 'out_bill_no' => $outTradeNo,
|
|
|
|
|
+ 'transfer_scene_id' => '1000',
|
|
|
|
|
+ 'openid' => $account,
|
|
|
|
|
+ 'transfer_amount' => intval($amount * 100),
|
|
|
|
|
+ 'transfer_remark' => $body?$body:'收入提现',
|
|
|
|
|
+ 'user_recv_perception' => $body? $body : '收入提现',
|
|
|
|
|
+ "transfer_scene_report_infos"=> [
|
|
|
|
|
+ [
|
|
|
|
|
+ "info_type" => "活动名称",
|
|
|
|
|
+ "info_content" => "收入提现"
|
|
|
|
|
+ ],
|
|
|
|
|
+ [
|
|
|
|
|
+ "info_type" => "奖励说明",
|
|
|
|
|
+ "info_content" => "用户收入提现"
|
|
|
|
|
+ ]
|
|
|
|
|
+ ],
|
|
|
|
|
+ ];
|
|
|
|
|
+
|
|
|
|
|
+ $pay = $this->createPay($scene, $payType);
|
|
|
|
|
+ RedisService::set("caches:payments:wechat:{$scene}_{$outTradeNo}_pay", ['order' => $order, 'config' => $this->config], 7200);
|
|
|
|
|
+ if (empty($pay)) {
|
|
|
|
|
+ $this->error = '微信打款失败';
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ $result = $pay->transfer($payData);
|
|
|
|
|
+ RedisService::set("caches:payments:wechat:{$scene}_{$outTradeNo}_result", ['order' => $order,'result'=> $result, 'config' => $this->config], 7200);
|
|
|
|
|
+ $msg = isset($result['message'])? trim($result['message']) : '';
|
|
|
|
|
+ $batchId = isset($result['batch_id'])? trim($result['batch_id']) : '';
|
|
|
|
|
+ if(empty($batchId)){
|
|
|
|
|
+ $this->error = $msg? $msg : '微信打款失败';
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ $this->error = '微信打款成功';
|
|
|
|
|
+ return ['order_no'=> $outTradeNo,'batch_id'=> $batchId,'result'=>$result];
|
|
|
|
|
+ }else if ($payType == 20){
|
|
|
|
|
+ $payData = [
|
|
|
|
|
+ 'out_biz_no' => $outTradeNo,//商户订单号,内部订单号
|
|
|
|
|
+ 'trans_amount' => $amount, //订单总金额,单位为元,精确到小数点后两位,
|
|
|
|
|
+ 'biz_scene' => 'DIRECT_TRANSFER', //描述特定的业务场景,可传的参数如下:DIRECT_TRANSFER:单笔无密转账到支付宝,B2C现金红包PERSONAL_COLLECTION:C2C现金红包-领红包
|
|
|
|
|
+ 'product_code' => 'TRANS_ACCOUNT_NO_PWD', //业务产品码,单笔无密转账到支付宝账户固定为:TRANS_ACCOUNT_NO_PWD;收发现金红包固定为:STD_RED_PACKET;
|
|
|
|
|
+ 'remark' => $body? $body : '提现',//业务备注
|
|
|
|
|
+ 'order_title' => $body? $body : '提现',//转账业务的标题,用于在支付宝用户的账单里显示
|
|
|
|
|
+ 'payee_info' => [
|
|
|
|
|
+ 'identity' => $account,//参与方的唯一标识'208823395231'
|
|
|
|
|
+ 'name' => $realName,//参与方的唯一标识'208823395231'
|
|
|
|
|
+ 'identity_type' => 'ALIPAY_LOGON_ID',//参与方的标识类型,目前支持如下类型:1、ALIPAY_USER_ID 支付宝的会员ID2、ALIPAY_LOGON_ID:支付宝登录号,支持邮箱和手机号格式3、ALIPAY_OPEN_ID:支付宝openid
|
|
|
|
|
+ ],//收款方信息
|
|
|
|
|
+ ];
|
|
|
|
|
+ $pay = $this->createPay($scene, $payType);
|
|
|
|
|
+ RedisService::set("caches:payments:alipay:{$scene}_{$outTradeNo}_pay", ['order' => $order, 'config' => $this->config], 7200);
|
|
|
|
|
+ if (empty($pay)) {
|
|
|
|
|
+ $this->error = '支付宝打款失败';
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ $result = $pay->transfer($payData);
|
|
|
|
|
+ RedisService::set("caches:payments:alipay:{$scene}_{$outTradeNo}_result", ['order' => $order,'result'=> $result, 'config' => $this->config], 7200);
|
|
|
|
|
+ $code = isset($result['code'])? intval($result['code']) : '';
|
|
|
|
|
+ $msg = isset($result['sub_msg'])? trim($result['sub_msg']) : '';
|
|
|
|
|
+ if($code != 10000){
|
|
|
|
|
+ $this->error = $msg? $msg : '支付宝打款失败';
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ $this->error = '支付宝打款成功';
|
|
|
|
|
+ return $result;
|
|
|
|
|
+ }else if($payType == 50){
|
|
|
|
|
+ $this->error = '银行卡打款未开通';
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ $this->error = '打款失败';
|
|
|
|
|
+ return false;
|
|
|
|
|
+ } catch (\Exception $exception) {
|
|
|
|
|
+ RedisService::set("caches:payments:trabsfer:{$scene}_{$outTradeNo}_error", ['order' => $order,'error'=>$exception->getTrace(), 'config' => $this->config], 7200);
|
|
|
|
|
+ $this->error = $exception->getMessage();
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|