PayUtils.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. <?php
  2. namespace common\pay\huiying;
  3. use Yii;
  4. use yii\helpers\VarDumper;
  5. class PayUtils
  6. {
  7. #签名函数生成签名串
  8. public static function getReqHmacString($params, $p1_MerId, $merchantKey)
  9. {
  10. #进行签名处理,一定按照文档中标明的签名顺序进行
  11. $sbOld = "";
  12. #加入业务类型
  13. $sbOld = $sbOld . $params['p0_Cmd'];
  14. #加入商户编号
  15. $sbOld = $sbOld . $params['p1_MerId'];
  16. #加入商户订单号
  17. $sbOld = $sbOld . $params['p2_Order'];
  18. #加入支付金额
  19. $sbOld = $sbOld . $params['p3_Amt'];
  20. #加入交易币种
  21. $sbOld = $sbOld . $params['p4_Cur'];
  22. #加入商品名称
  23. $sbOld = $sbOld . $params['p5_Pid'];
  24. #加入商品分类
  25. $sbOld = $sbOld . $params['p6_Pcat'];
  26. #加入商品描述
  27. $sbOld = $sbOld . $params['p7_Pdesc'];
  28. #加入商户接收支付成功数据的地址
  29. $sbOld = $sbOld . $params['p8_Url'];
  30. #加入送货地址标识
  31. $sbOld = $sbOld . $params['p9_SAF'];
  32. #加入商户扩展信息
  33. $sbOld = $sbOld . $params['pa_MP'];
  34. #加入支付通道编码
  35. $sbOld = $sbOld . $params['pd_FrpId'];
  36. #加入是否需要应答机制
  37. $sbOld = $sbOld . $params['pr_NeedResponse'];
  38. Yii::warning('支付请求参数huiying,' . VarDumper::dumpAsString($sbOld), __METHOD__);
  39. return static::HmacMd5($sbOld, $merchantKey);
  40. }
  41. public static function getCallbackHmacString($params, $p1_MerId, $merchantKey)
  42. {
  43. #取得加密前的字符串
  44. $sbOld = "";
  45. #加入商家ID
  46. $sbOld = $sbOld . $p1_MerId;
  47. #加入消息类型
  48. $sbOld = $sbOld. $params['r0_Cmd'];
  49. #加入业务返回码
  50. $sbOld = $sbOld . $params['r1_Code'];
  51. #加入交易ID
  52. $sbOld = $sbOld . $params['r2_TrxId'];
  53. #加入交易金额
  54. $sbOld = $sbOld . $params['r3_Amt'];
  55. #加入货币单位
  56. $sbOld = $sbOld . $params['r4_Cur'];
  57. #加入产品Id
  58. $sbOld = $sbOld . $params['r5_Pid'];
  59. #加入订单ID
  60. $sbOld = $sbOld . $params['r6_Order'];
  61. #加入用户ID
  62. $sbOld = $sbOld . $params['r7_Uid'];
  63. #加入商家扩展信息
  64. $sbOld = $sbOld . $params['r8_MP'];
  65. #加入交易结果返回类型
  66. $sbOld = $sbOld . $params['r9_BType'];
  67. return static::HmacMd5($sbOld, $merchantKey);
  68. }
  69. public static function CheckHmac($params, $p1_MerId, $merchantKey)
  70. {
  71. if($params['hmac'] == static::getCallbackHmacString($params, $p1_MerId, $merchantKey))
  72. return true;
  73. else
  74. return false;
  75. }
  76. public static function HmacMd5($data, $key)
  77. {
  78. //需要配置环境支持iconv,否则中文参数不能正常处理
  79. $key = iconv("GB2312","UTF-8",$key);
  80. $data = iconv("GB2312","UTF-8",$data);
  81. $b = 64; // byte length for md5
  82. if (strlen($key) > $b) {
  83. $key = pack("H*",md5($key));
  84. }
  85. $key = str_pad($key, $b, chr(0x00));
  86. $ipad = str_pad('', $b, chr(0x36));
  87. $opad = str_pad('', $b, chr(0x5c));
  88. $k_ipad = $key ^ $ipad ;
  89. $k_opad = $key ^ $opad;
  90. return md5($k_opad . pack("H*",md5($k_ipad . $data)));
  91. }
  92. }