RefundLogRepository.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Mead
  5. * Date: 2019/8/6
  6. * Time: 9:16 PM
  7. */
  8. namespace App\Repositories;
  9. use App\Library\Alipay\Alipay;
  10. use App\Models\AdminMerchant;
  11. use App\Models\RefundLog;
  12. use Carbon\Carbon;
  13. use EasyWeChat\Factory;
  14. use Illuminate\Support\Facades\Log;
  15. class RefundLogRepository extends BaseRepository
  16. {
  17. protected $model;
  18. protected static $MERCHANT_ID = 0;
  19. protected static $MERCHANT = [];
  20. protected static $URLS = [
  21. 'api/relay/order/auto-close',
  22. 'api/common/clear-cache',
  23. 'api/t',
  24. ];
  25. public function __construct(RefundLog $model)
  26. {
  27. $this->model = $model;
  28. $merchant_id = merchant_id();
  29. if (!$merchant_id) {
  30. throw new \Exception('商户id错误');
  31. }
  32. self::$MERCHANT_ID = $merchant_id;
  33. self::$MERCHANT = AdminMerchant::byId($merchant_id);
  34. if (!self::$MERCHANT) {
  35. throw new \Exception('平台暂停服务,如有不便敬请谅解');
  36. }
  37. }
  38. //微信退款退款查询 一改造为byUserIdCheckUserIsRefundOk_alipay_wxapp()
  39. public function byUserIdCheckUserIsRefundOk($user_id)
  40. {
  41. $return = [
  42. 'status' => true,
  43. 'msg' => '退款成功'
  44. ];
  45. $refund = $this->model->where('user_id', $user_id)->where('pay_status', RefundLog::PAY_STATUS_NO)->orderBy('id', 'desc')->first();
  46. if ($refund) {
  47. //检查是否退款成功
  48. $payment = Factory::payment(wechat_pay_config(self::$MERCHANT)); // 微信支付
  49. $no = $refund->deposit->no;
  50. $re = $payment->refund->queryByOutTradeNumber($no);
  51. if ($re['return_code'] === 'SUCCESS' && $re['result_code'] === 'SUCCESS') {
  52. switch ($re['refund_status_0']) {
  53. case 'SUCCESS':
  54. //退款成功
  55. $return = [
  56. 'status' => true,
  57. 'msg' => '退款成功'
  58. ];
  59. $refund->pay_time = $re['refund_success_time_0'];
  60. $refund->pay_status = RefundLog::PAY_STATUS_OK;
  61. $refund->save();
  62. //退款成功回调
  63. $refund->refund_order_callback();
  64. break;
  65. case 'REFUNDCLOSE':
  66. //退款关闭
  67. $return = [
  68. 'status' => false,
  69. 'msg' => '退款关闭'
  70. ];
  71. break;
  72. case 'PROCESSING':
  73. //退款处理中
  74. $return = [
  75. 'status' => false,
  76. 'msg' => '退款处理中,请稍后再试。'
  77. ];
  78. break;
  79. case 'CHANGE':
  80. //退款异常
  81. $return = [
  82. 'status' => false,
  83. 'msg' => '退款异常'
  84. ];
  85. $refund->pay_status = RefundLog::PAY_STATUS_ERROR;
  86. $refund->result = $re['err_code_des'];
  87. break;
  88. }
  89. } else {
  90. $return = [
  91. 'status' => false,
  92. 'code' => $re['err_code'],
  93. 'msg' => $re['err_code_des']
  94. ];
  95. }
  96. }
  97. return $return;
  98. }
  99. //支付宝退款查询
  100. public function byUserIdCheckUserIsRefundOk_alipay_wxapp($user_id)
  101. {
  102. $return = [
  103. 'status' => true,
  104. 'msg' => '退款成功'
  105. ];
  106. $refund = $this->model->where('user_id', $user_id)->where('pay_status', RefundLog::PAY_STATUS_NO)->orderBy('id', 'desc')->first();
  107. if (!empty($refund)) {
  108. switch ($refund['pay_type']){
  109. case RefundLog::PAY_TYPE_WECHAT: //微信
  110. //检查是否退款成功
  111. $payment = Factory::payment(wechat_pay_config(self::$MERCHANT)); // 微信支付
  112. $no = $refund->deposit->no;
  113. $re = $payment->refund->queryByOutTradeNumber($no);
  114. if ($re['return_code'] === 'SUCCESS' && $re['result_code'] === 'SUCCESS') {
  115. switch ($re['refund_status_0']) {
  116. case 'SUCCESS':
  117. //退款成功
  118. $return = [
  119. 'status' => true,
  120. 'msg' => '退款成功'
  121. ];
  122. $refund->pay_time = $re['refund_success_time_0'];
  123. $refund->pay_status = RefundLog::PAY_STATUS_OK;
  124. $refund->save();
  125. //退款成功回调
  126. $refund->refund_order_callback();
  127. break;
  128. case 'REFUNDCLOSE':
  129. //退款关闭
  130. $return = [
  131. 'status' => false,
  132. 'msg' => '退款关闭'
  133. ];
  134. break;
  135. case 'PROCESSING':
  136. //退款处理中
  137. $return = [
  138. 'status' => false,
  139. 'msg' => '退款处理中,请稍后再试。'
  140. ];
  141. break;
  142. case 'CHANGE':
  143. //退款异常
  144. $return = [
  145. 'status' => false,
  146. 'msg' => '退款异常'
  147. ];
  148. $refund->pay_status = RefundLog::PAY_STATUS_ERROR;
  149. $refund->result = $re['err_code_des'];
  150. break;
  151. }
  152. } else {
  153. $return = [
  154. 'status' => false,
  155. 'code' => $re['err_code'],
  156. 'msg' => $re['err_code_des']
  157. ];
  158. }
  159. break;
  160. case RefundLog::PAY_TYPE_ALIPAYMINI: //支付宝
  161. $no = $refund->deposit->no;
  162. $result = alipay_mini_config(self::$MERCHANT)->payment()->common()->queryRefund($no,$refund->no);//$refund->no
  163. if($result->code=='10000'){
  164. if($result->refundAmount>0){ //退款成功 退款金额
  165. //退款成功
  166. $return = [
  167. 'status' => true,
  168. 'msg' => '退款成功'
  169. ];
  170. // $refund->pay_time = $result['refund_success_time_0']; //需与支付宝约定配置
  171. $refund->pay_time = Carbon::now();//暂定当前时间
  172. $refund->pay_status = RefundLog::PAY_STATUS_OK;
  173. $refund->save();
  174. //退款成功回调
  175. $refund->refund_order_callback();
  176. }else{
  177. //失败
  178. $return = [
  179. 'code' => 'REFUNDNOTEXIST', //支付宝伪造微信退款查询失败
  180. 'status' => false,
  181. 'msg' => '没有找到退款'
  182. ];
  183. }
  184. }
  185. break;
  186. case RefundLog::PAY_TYPE_ALIPAYMINI_CREDIT:
  187. //支付宝押金预授权支付方式
  188. if(!isset($refund->deposit->no)){
  189. return [
  190. 'status' => false,
  191. 'msg' => '记录缺失',
  192. ];;
  193. }
  194. $no = $refund->deposit->no;
  195. $alipayobj = new Alipay();
  196. $data = AlipayYushouquanJiedong(self::$MERCHANT,$no,$refund->no);
  197. $resultdata = $alipayobj->AlipayQueryYushouquan($data); // 预授权查询
  198. if(!empty($resultdata->code) && $resultdata->code==10000 && $resultdata->status=='SUCCESS') {
  199. if ($resultdata->rest_amount == '0.00') {
  200. //已经解冻成功 修改
  201. $return = [
  202. 'status' => true,
  203. 'msg' => '退款成功'
  204. ];
  205. // $refund->pay_time = $result['refund_success_time_0']; //需与支付宝约定配置
  206. $refund->pay_time = Carbon::now();//暂定当前时间
  207. $refund->pay_status = RefundLog::PAY_STATUS_OK;
  208. $refund->save();
  209. //退款成功回调
  210. $refund->refund_order_callback();
  211. } else {
  212. $data = AlipayYushouquanJiedongQingqiu($data, $resultdata->auth_no, $refund->no, $resultdata->rest_amount);//准备解冻参数
  213. //没有解冻
  214. $return = [
  215. 'code' => 'REFUNDNOTEXIST', //支付宝伪造微信退款查询失败
  216. 'status' => false,
  217. 'msg' => '没有冻结成功',
  218. 'data' => $data
  219. ];
  220. }
  221. }else{
  222. $return = [
  223. 'code' => 'ZHIFUBAOSHIBIA', //支付宝伪造微信退款查询失败
  224. 'status' => false,
  225. 'msg' => $resultdata->sub_msg
  226. ];
  227. }
  228. break;
  229. default:
  230. }
  231. }
  232. return $return;
  233. }
  234. public function byUserIdUserRefundNoModel($user_id)
  235. {
  236. $refund = $this->model->where('user_id', $user_id)->where('pay_status', RefundLog::PAY_STATUS_NO)->orderBy('id', 'desc')->first();
  237. return $refund;
  238. }
  239. }