AliPay.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Author: 芸众商城 www.yunzshop.com
  5. * Date: 2017/3/17
  6. * Time: 下午12:01
  7. */
  8. namespace app\common\services;
  9. use app\common\exceptions\AppException;
  10. use app\common\helpers\Url;
  11. use app\common\models\MemberShopInfo;
  12. use app\common\models\OrderPay;
  13. use app\common\models\PayOrder;
  14. use app\common\models\PayType;
  15. use app\common\services\alipay\MobileAlipay;
  16. use app\common\services\alipay\WebAlipay;
  17. use app\common\services\alipay\WapAlipay;
  18. use app\common\services\alipay\AlipayTradeRefundRequest;
  19. use Yansongda\Pay\Gateways\Alipay\Support;
  20. class AliPay extends Pay
  21. {
  22. protected $payService;
  23. private $pay_type;
  24. public function __construct()
  25. {
  26. $this->pay_type = config('app.pay_type');
  27. }
  28. public function setPayService($is_withdraw = 0)
  29. {
  30. $pay = \Setting::get('shop.pay');
  31. Utils::dataDecrypt($pay);
  32. if ($is_withdraw) {
  33. $config = [
  34. 'app_id' => $pay['alipay_transfer_app_id'],
  35. 'notify_url' => Url::shopSchemeUrl('payment/alipay/preNotifyUrl.php'),
  36. 'return_url' => Url::shopSchemeUrl('payment/alipay/returnUrl.php'),
  37. 'private_key' => $pay['alipay_transfer_private'],
  38. // 应用公钥证书路径
  39. 'app_cert_public_key' => $pay['alipay_app_public_cert'],
  40. // 支付宝根证书路径
  41. 'alipay_root_cert' => $pay['alipay_root_cert'],
  42. // 公钥证书
  43. 'ali_public_key' => $pay['alipay_public_cert'],
  44. ];
  45. $this->payService = \Yansongda\Pay\Pay::alipay($config);
  46. } else {
  47. $config = [
  48. 'app_id' => $pay['alipay_app_id'],
  49. 'ali_public_key' => $pay['rsa_public_key'],
  50. 'private_key' => $pay['rsa_private_key'],
  51. 'notify_url' => Url::shopSchemeUrl('payment/alipay/preNotifyUrl.php'),
  52. 'return_url' => Url::shopSchemeUrl('payment/alipay/returnUrl.php'),
  53. ];
  54. $this->payService = \Yansongda\Pay\Pay::alipay($config);
  55. }
  56. }
  57. /**
  58. * @param $data
  59. * @param $payType
  60. * @return bool|mixed
  61. */
  62. public function doPay($data, $payType = 2)
  63. {
  64. $this->setPayService();
  65. $op = "支付宝订单支付 订单号:" . $data['order_no'];
  66. $pay_type_name = PayType::get_pay_type_name($payType);
  67. $this->log($data['extra']['type'], $pay_type_name, $data['amount'], $op, $data['order_no'], Pay::ORDER_STATUS_NON, \YunShop::app()->getMemberId());
  68. if ($payType == PayFactory::PAY_APP_ALIPAY) {
  69. \Log::info('云打包支付宝APP支付,支付订单号:' . $data['order_no']);
  70. return true;
  71. }
  72. $order = [
  73. 'body' => \YunShop::app()->uniacid,
  74. 'subject' => $data['subject'],
  75. 'out_trade_no' => \YunShop::app()->uniacid . '_' . $data['order_no'],
  76. 'total_amount' => $data['amount'],
  77. 'http_method' => 'GET'
  78. ];
  79. if (request()->pc == 1) {
  80. return $this->payService->web($order)->getTargetUrl();
  81. }
  82. return $this->payService->wap($order)->getTargetUrl(); }
  83. public function doRefund($out_trade_no, $totalmoney, $refundmoney = '0')
  84. {
  85. $this->setPayService();
  86. $out_refund_no = $this->setUniacidNo(\YunShop::app()->uniacid);
  87. $op = '支付宝退款 订单号:' . $out_trade_no . '退款单号:' . $out_refund_no . '退款金额:' . $refundmoney;
  88. if (empty($out_trade_no)) {
  89. throw new AppException('参数错误');
  90. }
  91. $pay_type_id = OrderPay::get_paysn_by_pay_type_id($out_trade_no);
  92. $pay_type_name = PayType::get_pay_type_name($pay_type_id);
  93. $refund_order = $this->refundlog(Pay::PAY_TYPE_REFUND, $pay_type_name, $refundmoney, $op, $out_trade_no, Pay::ORDER_STATUS_NON, 0);
  94. //支付宝交易单号
  95. $pay_order_model = PayOrder::getPayOrderInfo($out_trade_no)->first();
  96. if (empty($pay_order_model)) {
  97. return false;
  98. }
  99. $refund_data = array(
  100. 'out_trade_no' => $pay_order_model->out_order_no,
  101. 'trade_no' => $pay_order_model->trade_no,
  102. 'refund_amount' => $refundmoney,
  103. 'refund_reason' => '正常退款',
  104. 'out_request_no' => $out_refund_no
  105. );
  106. $third_type = '商城支付宝2.0新接口退款';
  107. if ($pay_type_id == 10) {
  108. // app支付的修改配置
  109. $pay = \Setting::get('shop_app.pay');
  110. $config = [
  111. 'app_id' => $pay['alipay_appid'],
  112. 'ali_public_key' => $pay['refund_alipay_sign_public'] ?: $pay['alipay_sign_public'],
  113. 'private_key' => $pay['refund_alipay_sign_private'] ?: $pay['alipay_sign_private'],
  114. ];
  115. Support::getInstance()->clear();
  116. $this->payService = \Yansongda\Pay\Pay::alipay($config);
  117. $third_type = '支付宝APP退款';
  118. }
  119. $res = $this->payService->refund($refund_data);
  120. if (!empty($res) && $res['code'] == '10000') {
  121. $refund_order->status = Pay::ORDER_STATUS_COMPLETE;
  122. $refund_order->trade_no = $res['trade_no'];
  123. $refund_order->save();
  124. $this->payResponseDataLog($out_trade_no, $third_type, json_encode($res));
  125. return true;
  126. }
  127. \Log::debug('---alipay-app---', [$refund_data, $res]);
  128. throw new AppException($res['msg'] . '-' . $res['sub_msg']);
  129. }
  130. public function doWithdraw($member_id, $out_trade_no, $money, $desc = '', $type = 1)
  131. {
  132. $this->setPayService(1);
  133. $op = '支付宝提现 批次号:' . $out_trade_no . '提现金额:' . $money;
  134. $pay_order_model = $this->withdrawlog(Pay::PAY_TYPE_REFUND, $this->pay_type[Pay::PAY_MODE_ALIPAY], $money, $op, $out_trade_no, Pay::ORDER_STATUS_NON, $member_id);
  135. $member_info = MemberShopInfo::select(['alipay', 'alipayname'])->where('member_id', $member_id)->first();
  136. $account = $member_info['alipay'];
  137. $name = $member_info['alipayname'];
  138. if (empty($account) || empty($name)) {
  139. throw new AppException('没有设定支付宝账号');
  140. }
  141. //请求数据日志
  142. $pay_data = [
  143. 'out_biz_no' => $out_trade_no,
  144. 'payee_account' => $account,
  145. 'amount' => $money,
  146. 'payee_real_name' => $name,
  147. ];
  148. $this->payRequestDataLog($pay_order_model->id, $pay_order_model->type, $pay_order_model->type, json_encode($pay_data));
  149. $data = [
  150. 'out_biz_no' => $out_trade_no,
  151. 'trans_amount' => $money,
  152. 'product_code' => 'TRANS_ACCOUNT_NO_PWD',
  153. 'biz_scene' => 'DIRECT_TRANSFER',
  154. 'order_title' => '佣金提现',
  155. 'payee_info' => [
  156. 'identity' => $account,
  157. 'identity_type' => 'ALIPAY_LOGON_ID',
  158. 'name' => $name,
  159. ]
  160. ];
  161. $result = $this->payService->transfer($data);
  162. if ($result['code'] != '10000') {
  163. \Log::debug('-----支付宝转账失败-----', $result['data']);
  164. return ['errno' => 1, 'message' => $result['msg']];
  165. }
  166. $pay_refund_model = \app\common\models\PayWithdrawOrder::getOrderInfo($out_trade_no);
  167. if ($pay_refund_model) {
  168. $pay_refund_model->status = 2;
  169. $pay_refund_model->trade_no = $out_trade_no;
  170. $pay_refund_model->save();
  171. }
  172. event(new \app\common\events\finance\AlipayWithdrawEvent($out_trade_no));
  173. return ['errno' => 0, 'message' => $result['msg']];
  174. }
  175. public function buildRequestSign()
  176. {
  177. // TODO: Implement buildRequestSign() method.
  178. }
  179. }