• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP实现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_12index=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_7index=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实现微信提现功能
    • PHP实现 APP端微信支付功能
    • PHP开发APP端微信支付功能
    • php微信支付之APP支付方法
    • PHP APP微信提现接口代码
    上一篇:PHP有序表查找之插值查找算法示例
    下一篇:ThinkPHP整合datatables实现服务端分页的示例代码
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    PHP实现APP微信支付的实例讲解 PHP,实现,APP,微信,支付,的,