• 技术文章 >微信小程序 >微信开发

    通过PHP来实现APP微信支付的实例分析

    php中世界最好的语言php中世界最好的语言2018-03-05 13:47:09原创1292
    当今用APP微信支付已经成为了主流的支付模式,下面小编将为大家介绍一篇通过PHP实现APP微信支付的实例讲解,简单易学,一起跟小编学习APP微信支付吧。

    一、PHP后台后台生成预支付交易单,返回正确的预支付交易回话标识后再在APP里面调起支付!

    官方文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1

    根据文档拼接微信需要的参数,这里需要几个方法,直接上代码!

    传输给微信的参数要组装成xml格式发送,传如参数数组!

    public function ToXml($data=array())
     {
     if(!is_array($data) || count($data) <= 0)
     {
      return '数组异常';
     }
     $xml = "<xml>";
     foreach ($data as $key=>$val)
     {
      if (is_numeric($val)){
      $xml.="<".$key.">".$val."</".$key.">";
      }else{
      $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
      }
     }
     $xml.="</xml>";
     return $xml;
     }

    2.生成随机字符串,微信所需参数! 这里方法很多,看自己爱好都行!

    function rand_code(){
     $str = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';//62个字符
     $str = str_shuffle($str);
     $str = substr($str,0,32);
     return $str;
    }

    3.这里是微信比较重要的一步了,这个方法会多次用到!生成签名

    private function getSign($params) {
     ksort($params); //将参数数组按照参数名ASCII码从小到大排序
     foreach ($params as $key => $item) {
      if (!empty($item)) {  //剔除参数值为空的参数
      $newArr[] = $key.'='.$item; // 整合新的参数数组
      }
     }
     $stringA = implode("&", $newArr);  //使用 & 符号连接参数
     $stringSignTemp = $stringA."&key="."************************"; //拼接key
     // key是在商户平台API安全里自己设置的
     $stringSignTemp = MD5($stringSignTemp); //将字符串进行MD5加密
     $sign = strtoupper($stringSignTemp); //将所有字符转换为大写
     return $sign;
     }

    4.传递参数给微信,生成预支付订单! 接收微信返回的数据,在反给APP端,APP端调用支付接口,完成支付 ! APP端所需参数见微信文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_12&index=2

    public function wx_pay() {
     $nonce_str = $this->rand_code(); //调用随机字符串生成方法获取随机字符串
     $data['appid'] ='wxdbc5dc*******'; //appid
     $data['mch_id'] = '1493*****' ; //商户号
     $data['body'] = "APP支付测试";
     $data['spbill_create_ip'] = $_SERVER['HTTP_HOST']; //ip地址
     $data['total_fee'] = 1;    //金额
     $data['out_trade_no'] = time().mt_rand(10000,99999); //商户订单号,不能重复
     $data['nonce_str'] = $nonce_str;   //随机字符串
     $data['notify_url'] = 'http://xxx.xxx.com/wx_notify'; //回调地址,用户接收支付后的通知,必须为能直接访问的网址,不能跟参数
     $data['trade_type'] = 'APP'; //支付方式
     //将参与签名的数据保存到数组 注意:以上几个参数是追加到$data中的,$data中应该同时包含开发文档中要求必填的剔除sign以外的所有数据
     $data['sign'] = $this->getSign($data); //获取签名
     $xml = $this->ToXml($data);  //数组转xml
     //curl 传递给微信方
     $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
     //header("Content-type:text/xml");
     $ch = curl_init();
     curl_setopt($ch,CURLOPT_URL, $url);
     if(stripos($url,"https://")!==FALSE){
      curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
     } else {
      curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
      curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验
     }
     //设置header
     curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1);
     curl_setopt($ch, CURLOPT_HEADER, FALSE);
     //要求结果为字符串且输出到屏幕上
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
     //设置超时
     curl_setopt($ch, CURLOPT_TIMEOUT, 30);
     curl_setopt($ch, CURLOPT_POST, TRUE);
     //传输文件
     curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
     //运行curl
     $data = curl_exec($ch);
     //返回结果
     if($data){
      curl_close($ch);
      //返回成功,将xml数据转换为数组.
      $re = $this->FromXml($data);
      if($re['return_code'] != 'SUCCESS'){
      json("201",'签名失败');
      }
      else{
      //接收微信返回的数据,传给APP!
      $arr =array(
       'prepayid' =>$re['prepay_id'],
       'appid' => 'wxdbc5dc*****',
       'partnerid' => '14937****',
       'package' => 'Sign=WXPay',
       'noncestr' => $nonce_str,
       'timestamp' =>time(),
      );
      //第二次生成签名
      $sign = $this->getSign($arr);
      $arr['sign'] = $sign;
      json('200','签名成功',$arr);
      }
     } else {
      $error = curl_errno($ch);
      curl_close($ch);
      json('201',"curl出错,错误码:$error");
     }
     }

    5.将xml数据转换为数组,接收微信返回数据时用到.

    public function FromXml($xml)
     {
     if(!$xml){
      echo "xml数据异常!";
     }
     //将XML转为array
     //禁止引用外部xml实体
     libxml_disable_entity_loader(true);
     $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
     return $data;
     }

    二、APP支付成功后,会调用你填写的回调地址.

    返回参数详见微信文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_7&index=3

    // 微信支付回调
     function wx_notify(){
      //接收微信返回的数据数据,返回的xml格式
      $xmlData = file_get_contents('php://input');
      //将xml格式转换为数组
      $data = $this->FromXml($xmlData);
      //用日志记录检查数据是否接受成功,验证成功一次之后,可删除。
      $file = fopen('./log.txt', 'a+');
      fwrite($file,var_export($data,true));
      //为了防止假数据,验证签名是否和返回的一样。
      //记录一下,返回回来的签名,生成签名的时候,必须剔除sign字段。
      $sign = $data['sign'];
      unset($data['sign']);
      if($sign == $this->getSign($data)){
      //签名验证成功后,判断返回微信返回的
      if ($data['result_code'] == 'SUCCESS') {
      //根据返回的订单号做业务逻辑
      $arr = array(
       'pay_status' => 1,
       );
      $re = M('order')->where(['order_sn'=>$data['out_trade_no']])->save($arr);
      //处理完成之后,告诉微信成功结果!
      if($re){
       echo '<xml>
      <return_code><![CDATA[SUCCESS]]></return_code>
      <return_msg><![CDATA[OK]]></return_msg>
      </xml>';exit();
      }
      }
      //支付失败,输出错误信息
      else{
      $file = fopen('./log.txt', 'a+');
      fwrite($file,"错误信息:".$data['return_msg'].date("Y-m-d H:i:s"),time()."\r\n"); 
      }
     }
     else{
      $file = fopen('./log.txt', 'a+');
      fwrite($file,"错误信息:签名验证失败".date("Y-m-d H:i:s"),time()."\r\n"); 
      }
    }

    在这里,微信APP支付流程就成功走完了!谢谢支持!

    以上就是PHP实现APP微信支付的具体方法了,通过小编的实例讲解,相信大家已经掌握了。

    相关推荐:

    微信支付之告警通知实例

    PHP微信支付开发之微信退款功能示例

    Thinkphp整合微信支付功能详解

    以上就是通过PHP来实现APP微信支付的实例分析的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:实例分析 php 支付
    上一篇:微信授权后用户头像保存到服务器实现方法 下一篇:ajax 实现微信网页授权登录的方法介绍
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• 有关争夺的课程推荐10篇• 微信公众开发使用消息接的方法• NodeJs开发微信公众号微信事件交互实例代码• C#开发微信门户及应用(1)--开始使用微信接口• 微信支付开发全网发布
    1/1

    PHP中文网