最新文章
标签云
网站统计
- 观海听潮•博客
- 81篇
- 151条
- 299187次
- 101次
- 美国弗吉尼亚州
您现在的位置是:首页 > 技术杂谈 > 微信 微信
开发前,需要商户申请微信支付,并且在微信支付平台开通支付功能。
1、URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder
2、请求参数:appid,mch_id,nonce_str,sign,body,out_trade_no,total_fee,spbill_create_ip,notify_url,trade_type。
3、当支付方式是公众号支付时,需要传openid来确认是谁支付的。
4、订单金额:微信支付金额必须精确到分,这个是跟支付宝不同的,需要注意。
5、签名失败问题:
商户key不正确 -> 商户key是由商户自己设置的,在微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置。
签名方式错误
6、支付请求成功后微信会返回一些信息:appid ,prepay_id等,然后在构造数组返给前端,由前端调起支付。
7、支付回调地址:是由开发者自己写的接口地址,用于处理支付后的一些操作,比如库存,状态等。
8、具体开发时要开启事务。
9、支付失败:
1、支付请求成功后生成签名错误:appId,nonceStr,package,signType,timeStamp,key=>paySign
2、微信支付授权目录:在微信商户平台(pay.weixin.qq.com)-->产品中心-->开发配置
授权目录:指前端付款页面,可以填多个,必须指向页面的所在目录,结尾/结束。
3、微信公众平台JS接口安全域名配置错误,域名必须是前端所在的域名。
10、一些经常用到的方法
签名生成方法:public function MakeSign($input, $mch_key) {
//签名步骤一:按字典序排序参数
ksort($input);
$string = "";
foreach ($input as $k => $v) {
if ($k != "sign" && $v != "" && !is_array($v)) {
$string .= $k . "=" . $v . "&";
}
}
$string = trim($string, "&");
//签名步骤二:在string后加入KEY
$string = $string . "&key=" . $mch_key;
//签名步骤三:MD5加密
$string = md5($string);
//签名步骤四:所有字符转为大写
$result = strtoupper($string);
return $result;
}
数组转xml:public function ToXml($input) {
if (!is_array($input) || count($input) <= 0) {
throw new WxPayException("数组数据异常!");
}
$xml = "<xml>";
foreach ($input as $key => $val) {
if (is_numeric($val)) {
$xml .= "<" . $key . ">" . $val . "</" . $key . ">";
} else {
$xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";
}
}
$xml .= "</xml>";
return $xml;
}
post请求方法:public function postXmlCurl($xml, $url, $useCert = false, $second = 30) {
$ch = curl_init();
//设置超时
curl_setopt($ch, CURLOPT_TIMEOUT, $second);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
//严格校验
//设置header
curl_setopt($ch, CURLOPT_HEADER, FALSE);
//要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
//post提交方式
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
//运行curl
$data = curl_exec($ch);
//返回结果
if ($data) {
curl_close($ch);
return $data;
} else {
$error = curl_errno($ch);
curl_close($ch);
return "curl出错,错误码:$error";
}
}
xml转数组方法:public function FromXml($xml) {
if (!$xml) {
throw new WxPayException("xml数据异常!");
}
//将XML转为array
//禁止引用外部xml实体
libxml_disable_entity_loader(true);
$values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $values;
}
获取用户ip地址:public function getIp() {
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
else
$ip = "unknown";
return ($ip);
}
/*
* 给微信发送确认
*/
public function return_success(){
$return['return_code'] = 'SUCCESS';
$return['return_msg'] = 'OK';
$xml_post = '<xml><return_code>'.$return['return_code'].'</return_code><return_msg>'.$return['return_msg'].'</return_msg></xml>';
echo $xml_post;
exit;
}
文章评论

评论列表