一分一毛也是爱

微信

微信

支付宝

支付宝

观海听潮

观海听潮博客

登录
还没有账号?去注册
观海听潮

观海听潮博客

注册
  • 欢迎来自美国弗吉尼亚州的访客,您好!
×

我的名片

网名:观海听潮

职业:PHP开发工程师

现居:山东省-青岛市

Email:1256699215@qq.com

网站统计

  • 观海听潮•博客
  • 54篇
  • 145条
  • 22697次
  • 308次
  • 美国弗吉尼亚州

您现在的位置是:首页  > 技术杂谈  > 微信 微信

观海听潮

微信支付

观海听潮 223天前 1119 0条评论
摘要
微信支付配置及流程

开发前,需要商户申请微信支付,并且在微信支付平台开通支付功能。

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;

}


转载请注明: 观海听潮博客

本文地址:https://chengzhigang.cn/al/2.html

讨厌 (0)
微博logo QQ空间logo QQlogo 豆瓣logo 人人logo 百度贴吧logo 有道云笔记logo

文章评论

表情表情
×
图片图片

评论列表