|
|
@@ -12,6 +12,7 @@ use Illuminate\Support\Facades\Cache;
|
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
|
|
use App\Services\Payment\QianBaoService;
|
|
|
+use App\Services\Payment\SanJinService;
|
|
|
|
|
|
use App\Services\WalletService;
|
|
|
use App\Services\BalanceLogService;
|
|
|
@@ -151,17 +152,157 @@ class PaymentOrderService extends BaseService
|
|
|
* @description: 创建代收订单
|
|
|
* @param {*} $memberId
|
|
|
* @param {*} $amount
|
|
|
- * @param {*} $channel
|
|
|
- * @param {*} $account
|
|
|
+ * @param {*} $paymentType 支付类型:支付宝、数字人民币
|
|
|
* @return {*}
|
|
|
*/
|
|
|
- public static function createPay($memberId,$amount,$channel,$account)
|
|
|
+ public static function createPay($memberId,$amount,$paymentType)
|
|
|
{
|
|
|
+ $result = [];
|
|
|
+ $result['chat_id'] = $memberId;
|
|
|
+ $channel = ''; // 支付的通道
|
|
|
+ $product = SanJinService::$PRODUCT;
|
|
|
+ $max = 0;
|
|
|
+ $min = 0;
|
|
|
+ $rate = 0;
|
|
|
+ foreach($product as $k => $v){
|
|
|
+ if($v['type'] == $paymentType){
|
|
|
+ if($amount >= $v['min'] && $amount <= $v['max']){
|
|
|
+ $channel = $k;
|
|
|
+ $rate = $v['rate'];
|
|
|
+
|
|
|
+ }
|
|
|
+ if($min == 0){
|
|
|
+ $min = $v['min'];
|
|
|
+ }
|
|
|
+ if($max == 0){
|
|
|
+ $max = $v['max'];
|
|
|
+ }
|
|
|
+ if($min > $v['min']){
|
|
|
+ $min = $v['min'];
|
|
|
+ }
|
|
|
+ if($max < $v['max']){
|
|
|
+ $max = $v['max'];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 没有找到支付通道
|
|
|
+ if(empty($channel)){
|
|
|
+ $text = "发起充值失败 \n";
|
|
|
+ $text .= "最低充值:".$min." \n";
|
|
|
+ $text .= "最高充值:".$max." \n";
|
|
|
+ $text .= "请重新填写充值的金额!";
|
|
|
+ $result['text'] = $text;
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
$data = [];
|
|
|
$data['type'] = self::TYPE_PAY;
|
|
|
+ $data['member_id'] = $memberId;
|
|
|
+ $data['amount'] = $amount;
|
|
|
+ $data['channel'] = $channel;
|
|
|
+ $data['fee'] = $amount * $rate;
|
|
|
$order_no = self::createOrderNo('sj'.$data['type'].'_', $memberId);
|
|
|
- $ret = QianBaoService::pay($amount, $order_no, $channel);
|
|
|
- return $ret;
|
|
|
+ $data['order_no'] = $order_no;
|
|
|
+ $data['callback_url'] = SanJinService::getNotifyUrl();
|
|
|
+ $data['remark'] = '充值费率:'.$rate;
|
|
|
+ $data['status'] = self::STATUS_STAY;
|
|
|
+ $ret = SanJinService::pay(($amount*100), $order_no, $channel);
|
|
|
+ if($ret['code'] == 0){
|
|
|
+
|
|
|
+ $qrCode = asset(self::createPaymentQrCode($ret['data']['payUrl']));
|
|
|
+ $result['image'] = $qrCode;
|
|
|
+ $item = $ret['data'];
|
|
|
+ $data['status'] = self::STATUS_PROCESS;
|
|
|
+ $data['pay_no'] = $item['tradeNo'];
|
|
|
+ $data['pay_url'] = $item['payUrl'];
|
|
|
+ $data['pay_data'] = json_encode($ret,JSON_UNESCAPED_UNICODE);
|
|
|
+ $info = self::model()::create($data);
|
|
|
+ $text = "✅ 支付提示 \n";
|
|
|
+ $text .= "请扫码支付 \n";
|
|
|
+ $text .= "支付金额:".$amount." RMB \n";
|
|
|
+ $text .= "请按实际支付金额进行付款,否则影响到账 \n";
|
|
|
+ $text .= "支付完成后请耐心等待,支付到账会第一时间通知您! \n";
|
|
|
+ $result['text'] = $text;
|
|
|
+ }else{
|
|
|
+ $result['text'] = $ret['message'];
|
|
|
+ }
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 接收支付的通知
|
|
|
+ * @param {*} $params
|
|
|
+ * @return {*}
|
|
|
+ */
|
|
|
+ public static function receivePay($params)
|
|
|
+ {
|
|
|
+ // 判断商户号
|
|
|
+ if($params['mchId'] == SanJinService::getMerchantId()){
|
|
|
+ $must = ['mchId','productId','tradeNo','outTradeNo','amount','payAmount','state','createTime','payTime'];
|
|
|
+
|
|
|
+
|
|
|
+ $info = self::findOne(['order_no' => $params['outTradeNo']]);
|
|
|
+ if($info){
|
|
|
+ // 平台以分计算转成元
|
|
|
+ $payAmount = $params['payAmount'] / 100;
|
|
|
+ // 判断金额是不是正确认
|
|
|
+ if($info->amount != $payAmount){
|
|
|
+ $text = '❌ 支付失败提醒 \n';
|
|
|
+ $text .= "订单金额:{$info->amount} \n";
|
|
|
+ $text .= "实际支付:{$payAmount} \n";
|
|
|
+ $text .= "订单号:{$params['outTradeNo']} \n";
|
|
|
+ $text .= "失败原因:支付金额与订单金额不一致 \n";
|
|
|
+ $text .= "请联系客服处理!";
|
|
|
+ self::sendMessage($info->member_id,$text);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if($params['sign'] != SanJinService::signature($params,$must)){
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if($info->status != self::STATUS_PROCESS){
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 付款
|
|
|
+ if($info->type == self::TYPE_PAY){
|
|
|
+ if($params['state'] == 1){
|
|
|
+ $info->status = self::STATUS_SUCCESS;
|
|
|
+ $wallet = WalletService::findOne(['member_id' => $info->member_id]);
|
|
|
+ $balance = $wallet->available_balance;
|
|
|
+ $available_balance = bcadd($balance,$payAmount,10);
|
|
|
+ $wallet->available_balance = $available_balance;
|
|
|
+ $wallet->save();
|
|
|
+
|
|
|
+ // 记录余额变动日志
|
|
|
+ BalanceLogService::addLog(
|
|
|
+ $info->member_id,
|
|
|
+ $payAmount,
|
|
|
+ $balance,
|
|
|
+ $available_balance,
|
|
|
+ '三方充值',
|
|
|
+ $info->id,
|
|
|
+ ''
|
|
|
+ );
|
|
|
+
|
|
|
+ $text = "✅ 支付成功 \n";
|
|
|
+ $text .= "充值金额:{$payAmount} RMB \n";
|
|
|
+ $text .= "订单号:{$params['outTradeNo']} \n";
|
|
|
+ $text .= "您充值的金额已到账,请注意查收!";
|
|
|
+ self::sendMessage($info->member_id,$text);
|
|
|
+ }else{
|
|
|
+ $info->status = self::STATUS_FAIL;
|
|
|
+ $text = "❌ 支付失败 \n";
|
|
|
+ $text .= "充值金额:{$payAmount} RMB \n";
|
|
|
+ $text .= "订单号:{$params['outTradeNo']} \n";
|
|
|
+ }
|
|
|
+ $info->save();
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -212,7 +353,7 @@ class PaymentOrderService extends BaseService
|
|
|
$order_no = self::createOrderNo('sj'.$data['type'].'_', $memberId);
|
|
|
$data['order_no'] = $order_no;
|
|
|
$data['member_id'] = $memberId;
|
|
|
- $data['free'] = $amount * 0.002 + 2;
|
|
|
+ $data['fee'] = $amount * 0.002 + 2;
|
|
|
$amount = number_format($amount, 2, '.', '');
|
|
|
$data['amount'] = $amount;
|
|
|
$data['channel'] = $channel;
|
|
|
@@ -345,7 +486,7 @@ class PaymentOrderService extends BaseService
|
|
|
if($info){
|
|
|
// 判断金额是不是正确认
|
|
|
if($info->amount != $params['amount']){
|
|
|
- return 'amount';
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
// 验证签名
|