PayUtils.php 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <?php
  2. namespace common\pay\wanxin;
  3. class PayUtils
  4. {
  5. /**
  6. * @param array $data
  7. * @param string $secretKey
  8. * @return string
  9. */
  10. public static function makeSign($data, $secretKey)
  11. {
  12. //加密前的字符串
  13. $str = "";
  14. #加入业务类型
  15. $str = $str.$data['p0_Cmd'];
  16. #加入商户编号
  17. $str = $str.$data['p1_MerId'];
  18. #加入商户订单号
  19. $str = $str.$data['p2_Order'];
  20. #加入支付金额
  21. $str = $str.$data['p3_Amt'];
  22. #加入交易币种
  23. $str = $str.$data['p4_Cur'];
  24. #加入商户接收支付成功数据的地址
  25. $str = $str.$data['p8_Url'];
  26. #加入支付通道编码
  27. $str = $str.$data['pd_FrpId'];
  28. #加入是否需要应答机制
  29. $str = $str.$data['pr_NeedResponse'];
  30. return self::HmacMd5($str,$secretKey);
  31. }
  32. /**
  33. * @param array $data 参数
  34. * @param string $secretKey
  35. * @return bool
  36. */
  37. public static function checkSign($data, $secretKey)
  38. {
  39. #取得加密前的字符串
  40. $sbOld = "";
  41. #加入商家ID
  42. $sbOld = $sbOld.$data['p1_MerId'];
  43. #加入消息类型
  44. $sbOld = $sbOld.$data['r0_Cmd'];
  45. #加入业务返回码
  46. $sbOld = $sbOld.$data['r1_Code'];
  47. #加入交易ID
  48. $sbOld = $sbOld.$data['r2_TrxId'];
  49. #加入交易金额
  50. $sbOld = $sbOld.$data['r3_Amt'];
  51. #加入货币单位
  52. $sbOld = $sbOld.$data['r4_Cur'];
  53. #加入产品Id
  54. $sbOld = $sbOld.$data['r5_Pid'];
  55. #加入订单ID
  56. $sbOld = $sbOld.$data['r6_Order'];
  57. #加入用户ID
  58. $sbOld = $sbOld.$data['r7_Uid'];
  59. #加入商家扩展信息
  60. $sbOld = $sbOld.$data['r8_MP'];
  61. #加入交易结果返回类型
  62. $sbOld = $sbOld.$data['r9_BType'];
  63. #新增的回调日期
  64. $sbOld = $sbOld.$data['rp_PayDate'];
  65. $sign = self::HmacMd5($sbOld,$secretKey); //生成的签名
  66. if ($sign == $data['hmac']) {
  67. return true;
  68. }else{
  69. return false;
  70. }
  71. }
  72. // MD5的加密方法
  73. public static function HmacMd5($data,$key){
  74. //需要配置环境支持iconv,否则中文参数不能正常处理
  75. $key = iconv("GB2312","UTF-8",$key);
  76. $data = iconv("GB2312","UTF-8",$data);
  77. $b = 64; // byte length for md5
  78. if (strlen($key) > $b) {
  79. $key = pack("H*",md5($key));
  80. }
  81. $key = str_pad($key, $b, chr(0x00));
  82. $ipad = str_pad('', $b, chr(0x36));
  83. $opad = str_pad('', $b, chr(0x5c));
  84. $k_ipad = $key ^ $ipad;
  85. $k_opad = $key ^ $opad;
  86. return md5($k_opad . pack("H*",md5($k_ipad . $data)));
  87. }
  88. }