PayUtils.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. namespace common\pay\otczhifu;
  3. class PayUtils
  4. {
  5. /**
  6. * @param array $data
  7. * @return string
  8. */
  9. public static function makeSign($data, $key,$payurl)
  10. {
  11. $kye = $key;
  12. ksort($data);
  13. $paramsStrExceptSign = '';
  14. foreach ($data as $k => $val) {
  15. $paramsStrExceptSign .= $val;
  16. }
  17. $paramsStrExceptSign .= $key;
  18. $sign = md5($paramsStrExceptSign);//签名
  19. //初始化
  20. $curl = curl_init();
  21. //设置抓取的url
  22. curl_setopt($curl, CURLOPT_URL, $payurl);
  23. //设置头文件的信息作为数据流输出
  24. curl_setopt($curl, CURLOPT_HEADER, false);
  25. //设置获取的信息以文件流的形式返回,而不是直接输出。
  26. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  27. curl_setopt($curl, CURLOPT_HTTPHEADER, [
  28. 'Sign:' . $sign
  29. ]);
  30. //设置post方式提交
  31. curl_setopt($curl, CURLOPT_POST, 1);
  32. //设置post数据
  33. $post_data = $data;
  34. curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
  35. //执行命令
  36. $return_data = curl_exec($curl);
  37. //关闭URL请求
  38. curl_close($curl);
  39. $return_data = json_decode($return_data, true);
  40. $tt = print_r($return_data,true);
  41. file_put_contents('heheheh.txt',$tt);
  42. if ($return_data['code'] == 200) { //成功
  43. return $return_data; //返回登录地址
  44. } else {
  45. return $return_data;
  46. }
  47. }
  48. //加密函数
  49. public static function encrypt($data, $rsa_publickey)
  50. {
  51. $split = str_split($data, 117); // 1024 bit && OPENSSL_PKCS1_PADDING 不大于117即可
  52. $crypto = '';
  53. foreach ($split as $chunk) {
  54. $isOkay = openssl_public_encrypt($chunk, $encryptData, $rsa_publickey);
  55. if (!$isOkay) {
  56. return false;
  57. }
  58. $crypto .= $encryptData;
  59. }
  60. return base64_encode($crypto);
  61. }
  62. //解密函数
  63. public static function decrypt($data, $rsa_privatekey)
  64. {
  65. $split = str_split(base64_decode($data), 128); // 1024 bit 固定172
  66. $crypto = '';
  67. foreach ($split as $chunk) {
  68. $isOkay = openssl_private_decrypt($chunk, $decryptData, $rsa_privatekey); // base64在这里使用,因为172字节是一组,是encode来的
  69. if (!$isOkay) {
  70. return false;
  71. }
  72. $crypto .= $decryptData;
  73. }
  74. return $crypto;
  75. }
  76. //响应和验签函数
  77. public static function response($data,$rsa_private,$key)
  78. {
  79. //接受到响应 第一步解密
  80. $rsa_private = openssl_get_privatekey($rsa_private); //解密出私钥
  81. $data = json_decode(PayUtils::decrypt($data, $rsa_private), true); //解密函数,得到数据
  82. ksort($data);
  83. $sign = $data['sign'];
  84. unset($data['sign']);
  85. $paramsStrExceptSign = '';
  86. foreach ($data as $k => $val) {
  87. $paramsStrExceptSign .= $k . $val;
  88. }
  89. $paramsStrExceptSign .= $key; //需要拼接上密钥
  90. if ($sign == md5($paramsStrExceptSign)) { //验签成功
  91. return $data['paymentNo']; //返回解析数据中的订单号码
  92. }else{
  93. return false; //验签不过就返回false
  94. }
  95. }
  96. }