Palmpay.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <?php
  2. namespace App\Libs\Pay;
  3. use GuzzleHttp\Client;
  4. use Exception;
  5. use Log;
  6. class Palmpay implements PayMerchantInterface {
  7. /**
  8. * @var mixed
  9. */
  10. private $appId = '6196';
  11. /**
  12. * @var mixed
  13. */
  14. private $mchId = '2132225001';
  15. /**
  16. * @var mixed
  17. */
  18. private $appkey = 'a17465d30ad74105a38948b8ce14237e';
  19. /**
  20. * @var mixed
  21. */
  22. private $subAppid;
  23. /**
  24. * @var Client
  25. */
  26. private $payClient;
  27. private $log;
  28. function __construct($config)
  29. {
  30. $this->subAppid = $config['subAppid'];
  31. $this->payClient = new client(['base_uri'=>'https://pay.palmpay.cn/','timeout'=>5]);
  32. $this->log = myLog('Palmpay');
  33. }
  34. //生成订单
  35. function send(array $data)
  36. {
  37. $data = [
  38. 'mchId'=>$this->mchId,
  39. 'appid'=>$this->appId,
  40. 'version'=>'3.0',
  41. 'productName'=>$data['body'],
  42. 'productDesc'=>$data['body'],
  43. 'openid'=>$data['openid'],
  44. 'subAppid'=>$this->subAppid,
  45. 'ip' => $data['create_ip'],
  46. 'money'=>$data['price'],
  47. 'outTradeNo'=>$data['trade_no'],
  48. 'notifyUrl'=>$data['notify_url']
  49. ];
  50. $data['sign'] = $this->makeSign($data);
  51. $pay_url = "sdkServer/thirdpays/pay/WECHAT_MNPROGRAM?".http_build_query($data);
  52. $response = '';
  53. try{
  54. $response = $this->payClient->request('GET',$pay_url)->getBody()->getContents();
  55. $response_object = json_decode($response,1);
  56. if(!$response_object['errcode']){
  57. $this->log->info('pay-result',$response_object['result']);
  58. return $response_object['result'];
  59. }
  60. $this->log->error('palmpay-error',[
  61. 'data'=>$data,
  62. 'response'=>$response_object
  63. ]);
  64. return [];
  65. }catch (Exception $e)
  66. {
  67. $this->log->error('palmpay-exception',[
  68. 'msg'=>$e->getMessage(),
  69. 'data'=>$data
  70. ]);
  71. }
  72. return [];
  73. }
  74. function makeSign(array $params)
  75. {
  76. return md5($params['appid'].'WECHAT_MNPROGRAM'.$params['money'].($params['outTradeNo'] ??"").$this->appkey);
  77. }
  78. /**
  79. * 支付回调
  80. * @param array $data
  81. */
  82. public function notify(array $data)
  83. {
  84. $this->log->info('pay-notify',$data);
  85. $sign = $data['sign'];
  86. $my_sign = $this->signCheck($data,$this->appkey);
  87. $this->log->info('pay-notify',[
  88. 'sign'=>$sign,
  89. 'my_sign'
  90. ]);
  91. return $sign == $my_sign;
  92. }
  93. /**
  94. * 订单查询
  95. * @param string $trade_no 商户订单号
  96. * @return bool
  97. */
  98. public function query(string $trade_no)
  99. {
  100. }
  101. /**
  102. * 退款申请
  103. * @param array $data
  104. * $data = [
  105. * 'third_orderid' => "", // 商户订单号
  106. * 'price' => "", // 总金额,以元为单位
  107. * 'refund_no' => '' , // 商户系统内部的退款单号,确保在商户系统下唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。
  108. * 'refund_price' =》 '', //退款总金额,单位为元,可部分退款
  109. * 'remark' => '' // 备注
  110. * ]
  111. */
  112. public function refund( $data)
  113. {
  114. $data = [
  115. 'mchId'=>$this->mchId,
  116. 'appid'=>$this->appId,
  117. 'version'=>'3.0',
  118. 'pdorderid' => $data['third_orderid'],
  119. 'money' => bcmul($data['price'] ,100,0),
  120. 'outRefundNo' => $data['refund_no'],
  121. 'refundMoney' => bcmul($data['refund_price'],100,0) ,
  122. "refundReason" => $data['remark'] ?? "",
  123. ];
  124. $data['sign'] = $this->makeRefundSign($data);
  125. $pay_url = "sdkServer/thirdpays/refund?".http_build_query($data);
  126. $response = '';
  127. try{
  128. $response = $this->payClient->request('GET',$pay_url)->getBody()->getContents();
  129. $response_object = json_decode($response,1);
  130. if(!$response_object['resultCode']){
  131. $this->log->info('refund-result',$response_object['result']);
  132. return ['status' => 1,"退款成功"];
  133. }
  134. $this->log->error('refund-error',[
  135. 'data'=>$data,
  136. 'response'=>$response_object
  137. ]);
  138. return ['status' => 0,'msg' => $response_object['message'] ??"接口退款失败" ];
  139. }catch (Exception $e)
  140. {
  141. $this->log->error('refund-exception',[
  142. 'msg'=>$e->getMessage(),
  143. 'data'=>$data
  144. ]);
  145. }
  146. return ['status' => 0,'msg' => "退款失败"];
  147. }
  148. private function signCheck($params, $key) {
  149. $signPars = "";
  150. ksort($params);
  151. foreach($params as $k => $v) {
  152. if("" != $v && "sign" != $k) {
  153. $signPars .= $k . "=" . $v . "&";
  154. }
  155. }
  156. $signPars .= "key=".$key;
  157. return md5($signPars);
  158. }
  159. private function makeRefundSign(array $data)
  160. {
  161. return md5($data['mchId'].$data['appid'].$data['pdorderid'].$data['money'].$data['version'].$data['outRefundNo'].$data['refundMoney'].$this->appkey);
  162. }
  163. }