error = 0; $this->error_code = 0; $this->msg = null; $this->data = null; $this->from_string($string); } public function to_array() { return (array)$this; } public function to_string() { return json_encode($this, JSON_UNESCAPED_UNICODE); } public function from_array($array) { foreach ($array as $key => $value) { if (property_exists($this, $key)) { $this->$key = $value; } } return true; } public function from_string($string) { return $this->from_array((array)json_decode($string)); } } /** * @note 获取当前页面的完整连接 * @return string */ function getLocaleUrl() { $is_https = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || (isset($_SERVER['REQUEST_SCHEME']) && $_SERVER['REQUEST_SCHEME'] == 'https'); $request_scheme = $is_https ? 'https://' : 'http://'; $hostname = $_SERVER['SERVER_NAME']; $hostport = (($is_https && '443' == $_SERVER['SERVER_PORT']) || (!$is_https && '80' == $_SERVER['SERVER_PORT'])) ? '' : ':' . intval($_SERVER['SERVER_PORT']); return $request_scheme . $hostname . $hostport . $_SERVER['PHP_SELF']; } /** * @date 2017-03-04 * @note 给参数按key的顺序排序。(支持递归) * @param mixed $parameter 要排序的参数 * @return array * @auth 应俊 */ function SortParam($parameter) { $parameter = (array)$parameter; foreach ($parameter as $k => $v) { if (is_array($v) || is_object($v)) { $parameter[$k] = SortParam($v); } } // 调用strcmp函数来排序,该函数区分大小写。 uksort($parameter, 'strcmp'); return $parameter; } /** * @date 2017-03-06 * @note 转换参数成字符串形式按key=value的形式,用&分隔)。 * @param mixed $parameter 要转换的参数 * @return string * @auth 应俊 */ function ConvertParam($parameter) { $parameter = (array)$parameter; $return = ''; foreach ($parameter as $k => $v) { if (is_array($v) || is_object($v)) { $return .= sprintf('&%s={%s}', $k, ConvertParam($v)); } else { $return .= sprintf('&%s=%s', $k, $v); } } $sublen = mb_strlen('&', USEDCHARSET); $retlen = mb_strlen($return, USEDCHARSET); $return = mb_substr($return, $sublen, $retlen - $sublen, USEDCHARSET); return $return; } /** * @date 2017-03-04 * @note 为参数生成签名 * @param mixed $parameter 要签名的参数 * @param string $signkey 签名key * @return string * @auth 应俊 */ function SignParameter($parameter, $signkey = '') { // 1:先把参数按参数名(key)从小到大排序 $parameter = SortParam($parameter); // 2:连接参数成一个字符串(按key=value的形式,用&分隔)。 $return = ConvertParam($parameter); // 3:结尾加上key=签名key $return .= '&key=' . $signkey; // 4:md5加密这个字符串 return md5($return); } /** * @param mixed $data * @return array|mixed */ function ChangePostData($data) { switch (gettype($data)) { case 'array': { foreach ($data as $key => $value) { $data[$key] = ChangePostData($value); } break; } case 'object': { $array = (array)$data; foreach ($array as $key => $value) { $data->$key = ChangePostData($value); } break; } default: { $data = preg_replace_callback('/\+/', function ($r) { return '%2B'; }, $data); $data = preg_replace_callback('/\&/', function ($r) { return '%26'; }, $data); break; } } return $data; } /** * @note 发送post请求 * @param string $url * @param mixed $data * @return string */ function SendPost($url, $data) { $data = http_build_query(ChangePostData($data)); $opts = array( 'http' => array( 'method' => 'POST', 'header' => "Content-type: application/x-www-form-urlencoded\r\n" . "Content-Length: " . strlen($data) . "\r\n", 'content' => $data, ), ); $context = stream_context_create($opts); $ret = file_get_contents($url, false, $context); $ret = trim($ret, "\xEF\xBB\xBF"); return $ret; } ?> 退款测试 $app_id, /// appid 'devkey' => $dev_key, /// 开发者key 'market_key' => $market_key, /// 门店key 'scode' => md5(date('Ymdhis') . rand(1000, 9999)), /// 随机数 'agent_key' => 'i33v0llvp0euhd1n9qo1fM2RV8vtog4y', /// 代理号 'game_key' => '7N0e0z2u2098pf1M2fj0kyB1D4n4ylkA', /// 渠道号 'user_key' => '100000', /// 用户号 'headImg' => '', /// 头像 'nickname' => '100000', /// 昵称 ); $ret = SendPost($url, $data); $ret = new ResultObject($ret); if ($ret->error) die($ret->msg); $sid = $ret->data->sid; $scode = $ret->data->scode; } } if (!isset($_POST['refund_fee'])) /// 有 sid 和 scode 但是 没有 refund_fee 则要求页面输入并提交 refund_fee 参数 { $url = getLocaleUrl(); $html = << function submit() { var transaction_id = document.getElementById('transaction_id').value; var out_trade_no = document.getElementById('out_trade_no').value; var refund_fee = document.getElementById('refund_fee').value; if ('' == refund_fee || undefined == refund_fee) { alert('请输入要退款的金额(单位为分)'); return; } var script = ""; $('#mainbody').append(script); $('#frm').submit(); }
退款测试
  • 三方订单号:
  • 平台订单号:
  • 退款金额:*
EOF; } else /// 有refund_fee参数表示已提交页面中输入的退款金额 { $data = array( 'appid' => $app_id, 'devkey' => $dev_key, 'sid' => $sid, 'scode' => $scode, 'transaction_id' => $_POST['transaction_id'], 'out_trade_no' => $_POST['out_trade_no'], 'refund_fee' => $_POST['refund_fee'], 'version' => 1, ); $data['sign'] = SignParameter($data, $sign_key); $result = new ResultObject(rawurldecode(SendPost('https://api.daoqijuyou77.cn/api/newpay/refund/', $data))); if (0 != $result->error) /// error不为0表示有错误发生 { $html = << alert('{$result->msg}'); EOL; } else /// 调用成功, 则把图片显示在前台中 { $html = << alert('申请退款成功!'); EOL; } } echo $html; ?>