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

互联网 18-3-5
当今用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微信支付的实例分析的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: 支付
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:微信授权后用户头像保存到服务器实现方法

相关资讯