WechatPay.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <?php
  2. /**
  3. * @copyright Copyright (c) 2017 https://www.sapixx.com All rights reserved.
  4. * @license Licensed (http://www.apache.org/licenses/LICENSE-2.0).
  5. * @author pillar<ltmn@qq.com>
  6. * 微信支付统一处理控制器
  7. */
  8. namespace app\common\facade\library;
  9. use app\common\model\SystemApis;
  10. use app\common\model\SystemMemberMiniapp;
  11. use app\common\model\SystemMemberPayment;
  12. use EasyWeChat\Factory; //微信公众号
  13. use Exception;
  14. class WechatPay{
  15. /**
  16. * 微信传统统一接口
  17. * 以是否传入sub_mchid商户号作为判断是否使用的是服务商模式
  18. * @param integer $app_id //所属在平台开通的应用ID
  19. * @param boolean $is_official //是否公众号
  20. * @param string $sub_mchid //子商户号(是否服务商模式)
  21. * @return void
  22. */
  23. public function doPay(int $app_id = 0,bool $official = false,string $sub_mchid = NULL){
  24. try{
  25. if ($app_id) {
  26. $config = SystemMemberPayment::config($app_id,'wepay');
  27. if(empty($config)){
  28. return ['code'=>0,'msg'=>'请确认微信支付配置是否有问题'];
  29. }
  30. $app = SystemMemberMiniapp::field('miniapp_appid,mp_appid,is_psp,psp_appid')->where(['id' => $app_id])->find();
  31. if(empty($official)){ //小程序
  32. if(empty($app->miniapp_appid)){
  33. return ['code'=>0,'msg'=>'未开通小程序支付'];
  34. }
  35. $config['app_id'] = $app->miniapp_appid;
  36. }else{//公众号
  37. if(empty($app->mp_appid)){
  38. return ['code'=>0,'msg'=>'未开通公众号支付'];
  39. }
  40. $config['app_id'] = $app->mp_appid;
  41. }
  42. if(empty($sub_mchid)){
  43. return Factory::payment($config);
  44. }else{
  45. if($app->is_psp && empty($app->psp_appid)){
  46. return ['code'=>0,'msg'=>'未配置服务商APPID'];
  47. }
  48. //服务商模式
  49. $config['app_id'] = $app->psp_appid;
  50. $appid = empty($official) ? $app->miniapp_appid : $app->mp_appid; //判断发起支付的是小程序还是公众号
  51. return Factory::payment($config)->setSubMerchant($sub_mchid,$appid);
  52. }
  53. }else{
  54. return Factory::payment(SystemApis::config('wepay'));
  55. }
  56. }catch (Exception $e) {
  57. return ['code'=>0,'msg' => $e->getMessage()];
  58. }
  59. }
  60. /**
  61. * 微信支付统一下单参数
  62. * $data = [
  63. * 'mchid' //商户号(空是正常支付,不为空是微信服务商模式支付)(非必填)
  64. * 'miniapp_id' //付款来自应用 ID(必填)
  65. * 'name' //产品名称(必填)
  66. * 'order_no' //单号(必填)
  67. * 'total_fee' //金额(分)(必填)
  68. * 'openid' //付款ID(必填)
  69. * 'note' //备注(非必填)
  70. * 'notify_url' //回调地址(必填)
  71. * ]
  72. * @param array $data //统一下单参数
  73. * @param integer $app //所属在平台开通的应用ID
  74. * @param boolean $official //是否公众号
  75. */
  76. public function orderPay(array $data,bool $official = false){
  77. try{
  78. $order = [
  79. 'trade_type' => empty($data['trade_type']) ? 'JSAPI' : $data['trade_type'],
  80. 'body' => $data['name'],
  81. 'out_trade_no' => (string)$data['order_no'],
  82. 'total_fee' => $data['total_fee'], //分
  83. 'notify_url' => $data['notify_url']
  84. ];
  85. if(isset($data['attach'])){
  86. $order['attach'] = $data['attach'];
  87. }
  88. //服务商模式
  89. $sub_mchid = NULL;
  90. if(isset($data['mchid'])){
  91. $sub_mchid = $data['mchid'];
  92. //JSAPI模式下Openid必传
  93. if(empty($data['trade_type'])){
  94. $order['sub_openid'] = $data['openid'];
  95. }
  96. if(isset($data['profit_sharing'])){ //是否有分账参数
  97. $order['profit_sharing'] = $data['profit_sharing'];
  98. }
  99. }else{
  100. if(empty($data['trade_type'])) {
  101. $order['openid'] = $data['openid'];
  102. }
  103. }
  104. $wechat = self::doPay($data['miniapp_id'],$official,$sub_mchid);
  105. $result = $wechat->order->unify($order);
  106. if($result['return_code'] == 'SUCCESS'){
  107. if($result['result_code'] == 'SUCCESS'){
  108. if(empty($data['trade_type'])){
  109. //JSAPI模式
  110. return ['code'=>200,'msg'=>'成功','data' => $wechat->jssdk->sdkConfig($result['prepay_id'])];
  111. }else{
  112. //NATIVE模式
  113. return ['code'=>200,'msg'=>'成功','data' => $result];
  114. }
  115. }else{
  116. return ['code'=>0,'msg'=> $result['err_code_des']];
  117. }
  118. }else{
  119. return ['code'=>0,'msg'=> $result['return_msg']];
  120. }
  121. }catch (Exception $e) {
  122. return ['code'=>0,'msg'=> $e->getMessage()];
  123. }
  124. }
  125. }