PayHandler.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <?php
  2. namespace common\pay\huayin;
  3. use backend\models\Deposit;
  4. use common\helpers\Utils;
  5. use common\pay\BasePayHandler;
  6. use Yii;
  7. class PayHandler extends BasePayHandler
  8. {
  9. public $payUrl;
  10. public $merchantCode;
  11. public $publicKey;
  12. public $privateKey;
  13. /**
  14. * @inheritdoc
  15. */
  16. public function init()
  17. {
  18. parent::init();
  19. if ($this->payUrl == null) {
  20. $this->payUrl = Yii::$app->params['huayin.payUrl'];
  21. }
  22. if ($this->merchantCode == null) {
  23. $this->merchantCode = Yii::$app->params['huayin.merchantCode'];
  24. }
  25. if ($this->publicKey == null) {
  26. $this->publicKey = Yii::$app->params['huayin.publicKey'];
  27. }
  28. if ($this->privateKey == null) {
  29. $this->privateKey = Yii::$app->params['huayin.privateKey'];
  30. }
  31. }
  32. /**
  33. * @param array $deposit
  34. * @param array $params
  35. * @return string
  36. */
  37. public function outPay($deposit, $params = [])
  38. {
  39. $data = [];
  40. $data['merchant_code'] = $this->merchantCode; // 参数名称:商家号 商户签约时,华银分配给商家的唯一身份标识
  41. $data['service_type'] = 'direct_pay'; // 参数名称:服务类型 固定值:direct_pay
  42. $data['notify_url'] = $this->notifyUrl; // 参数名称:服务器异步通知地址 支付成功后,华银会主动发送通知给商户,商户必须指定此通知地址
  43. $data['interface_version'] = 'V3.0'; // 参数名称:接口版本
  44. $data['input_charset'] = 'UTF-8'; // 参数名称:参数编码字符集 取值:UTF-8、GBK(必须大写)
  45. $data['sign_type'] = 'RSA-S'; // 参数名称:签名方式
  46. // 1.取值为:RSA或RSA-S,RSA使用pfx证书文件进行数据加密,RSA-S使用字符串密钥进行数据加密,商户需要从中选择一个值
  47. // 2.该字段不参与签名
  48. // $data['sign'] = ''; // 参数名称:签名数据 该字段不参与签名,值如何获取,请参考华银提供的示例代码。
  49. $data['return_url'] = $this->returnUrl; // 参数名称:页面跳转同步通知地址 支付成功后,通过页面跳转的方式跳转到商家网站
  50. $data['pay_type'] = 'b2c'; // 参数名称:支付类型 取值如下(必须小写,多选时请用逗号隔开)b2c(网银支付),weixin(微信扫码),alipay_scan(支付宝扫码),tenpay_scan(qq钱包扫码)
  51. $data['client_ip'] = isset($params['ip']) ? $params['ip'] : Utils::getClientIp(); // 参数名称:客户端IP 消费者创建交易时所使用机器的IP,最大长度为15个字符。举例:183.62.225.12
  52. $data['client_ip_check'] = '0'; // 参数名称:客户端IP是否校验标识 当值为1校验客户端IP;当值为0不校验客户端IP;
  53. $data['order_no'] = $deposit['id']; // 参数名称:商家订单号 商家网站生成的订单号,由商户保证其唯一性,由字母、数字、下划线组成。
  54. $data['order_time'] = date('Y-m-d H:i:s'); // 参数名称:商家订单时间 时间格式:yyyy-MM-dd HH:mm:ss
  55. $data['order_amount'] = number_format($deposit['rmb'], 2, '.', ''); // 参数名称:商家订单金额 以元为单位,精确到小数点后两位.例如:12.01
  56. $data['bank_code'] = $params['bankCode']; // 参数名称:网银直连银行代码 参见附录中的银行代码对照表,当该参数为空或与对照表中银行编码不一致时,直接跳转到华银收银台选择银行页面
  57. // $data['redo_flag'] = ''; // 参数名称:是否允许重复订单 当值为1时不允许商户订单号重复提交;当值为 0或空时允许商户订单号重复提交
  58. $data['product_name'] = 'RJ' . $deposit['id']; // 参数名称:商品名称
  59. // $data['product_code'] = ''; // 参数名称:商品编号
  60. // $data['product_num'] = ''; // 参数名称:商品数量 必须是整型数字
  61. // $data['product_desc'] = ''; // 参数名称:商品描述
  62. // $data['extra_return_param'] = ''; // 参数名称:回传参数 商户如果支付请求是传递了该参数,则通知商户支付成功时会回传该参数
  63. // $data['extend_param'] = ''; // 参数名称:业务扩展参数 格式:参数名1^参数值1|参数名2^参数值2...,多个参数使用“|”进行分割 例如:name ^Zhang San|sex^Male 跨境商家必选,非跨境商家可选
  64. // $data['show_url'] = ''; // 参数名称:商品展示URL 不得超过200个字符
  65. // $data['orders_info'] = ''; // 储存子订单的相关信息,限制20个商品
  66. $data['sign'] = PayUtils::makeSign($data, $this->privateKey);
  67. return static::createHtml($data, $this->payUrl);
  68. }
  69. /**
  70. * @param array $data
  71. * @return bool
  72. */
  73. public function handleNotify($data)
  74. {
  75. if (PayUtils::checkSign($data, $this->publicKey)) {
  76. if (isset($data['trade_status']) && $data['trade_status'] == 'SUCCESS') {
  77. $merOrderId = trim($data['order_no']);
  78. // $merOrderId = str_ireplace("SN", "", $merOrderId);
  79. /** @var Deposit $model */
  80. $model = Deposit::find()->where(['id' => $merOrderId])->asArray()->limit(1)->one();
  81. if ($model) {
  82. // $model->type = 1;
  83. // $model->save(false);
  84. return true;
  85. }
  86. }
  87. }
  88. return false;
  89. }
  90. public function outNotify($success)
  91. {
  92. if ($success == true) {
  93. return "SUCCESS";
  94. } else {
  95. return "ERROR";
  96. }
  97. }
  98. /**
  99. * @param array $data
  100. * @return bool
  101. */
  102. public function handleReturn($data)
  103. {
  104. if (PayUtils::checkSign($data, $this->publicKey)) {
  105. if (isset($data['trade_status']) && $data['trade_status'] == 'SUCCESS') {
  106. $merOrderId = trim($data['order_no']);
  107. // $merOrderId = str_ireplace("SN", "", $merOrderId);
  108. /** @var Deposit $model */
  109. $model = Deposit::find()->where(['id' => $merOrderId])->asArray()->limit(1)->one();
  110. if ($model) {
  111. return true;
  112. }
  113. }
  114. }
  115. return false;
  116. }
  117. public function outReturn($success)
  118. {
  119. }
  120. }