本文实例为大家分享了php微信扫码支付源码,供大家参考,具体内容如下

本文实例为大家分享了php微信扫码支付,公众号支付的具体代码,供大家参考,具体内容如下

代码中包含四个文件createUrl.php、ArrayToXML.php、returnGoodsUrl.php、notifyUrl.php

代码中包含四个文件createUrl.php、ArrayToXML.php、returnGoodsUrl.php、notifyUrl.php

微信扫码支付分为两种模式,

代码中包含四个文件createUrl.php、ArrayToXML.php、returnGoodsUrl.php、notifyUrl.php

 '公众号id', 'mch_id' => '商户id', 'nonce_str' =>uniqid(), 'sign_type' => 'MD5', 'body' => 'test', 'detail' => 'test detail', 'out_trade_no' => date.rand, 'total_fee' => 1, 'notify_url' => 'http://www.test.top/testpay/pay.php', 'trade_type' =>'JSAPI',]; ksort; $sign_str = urldecode(http_build_query; $sign_str .= '&key=商户密钥'; //echo $sign_str;exit; $sign_str = md5; $param['sign'] = strtoupper; function CurlPost($url, $param = [], $is_post = 1, $timeout = 5 ){ //初始化curl $curl = curl_init(); // 设置请求的路径 curl_setopt($curl, CURLOPT_URL, $url); if  { //设置POST提交 curl_setopt($curl, CURLOPT_POST, 0); } //显示输出结果 1代表 把接口返回的结果当作一个字符串处理 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 设置请求超时时间 curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); if  { //提交数据 -- 设置post提交的数据 if  { //http_build_query curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query; } else { curl_setopt($curl, CURLOPT_POSTFIELDS, $param); } } //执行请求 $data = $data_str = curl_exec; //处理错误 if ($error = curl_error { $log_data = array( 'url' => $url, 'param' => $param, 'error' => '' . $error . '', ); var_dump; exit; } # 关闭CURL curl_close; //json数据转换为数组 $data = json_decode; if  { $data = $data_str; } #调用玩接口之后写一个日志 $log = [ 'url' => $url, 'param' => $param, 'response' => $data_str ]; file_put_contents(__DIR__ . '/wechat.log', print_r; return $data; }function arr2Xml{ $xml = ' '; foreach( $arr as $key => $value ){ if { $xml.="".$value."".$key.">"; }else{ $xml.="".$key.">"; } } $xml .= ''; return $xml;} $xml = arr2Xml; $result = CurlPost( $url , arr2Xml; $api_arr = json_decode( json_encode(simplexml_load_string( $result , 'SimpleXMLElement', LIBXML_NOCDATA) ), true ); if( $api_arr['return_code'] == 'SUCCESS' ){ include __DIR__ . '/phpqrcode.php'; header('content-type:image/png'); echo Qrcode::png( $api_arr['code_url'] , false , 'H' , 6 ,2 );}

'****', 'mch_id'=>'***', 'nonce_str'=>uniqid(), 'sign_type'=>'MD5', 'body'=>'test', 'detail'=>'detail', 'out_trade_no'=>date.rand, 'total_fee'=>1, 'spbill_create_ip'=>$_SERVER['SERVER_ADDR'], 'notify_url'=>'http://****/test.php', 'trade_type'=>'NATIVE',];ksort; $sign_str=urldecode(http_build_query; $sign_str.='&key=8934e7d15453e97507ef794cf7b0519d'; $sign_str=md5; $param['sign']=strtoupper; //print_r;exit;function CurlPost($url, $param = [], $is_post = 1, $timeout = 5 ){ //初始化curl $curl = curl_init(); // 设置请求的路径 curl_setopt($curl, CURLOPT_URL, $url); if  { //设置POST提交 curl_setopt($curl, CURLOPT_POST, 0); } //显示输出结果 1代表 把接口返回的结果当作一个字符串处理 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 设置请求超时时间 curl_setopt($curl, CURLOPT_TIMEOUT, $timeout); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); if  { //提交数据 -- 设置post提交的数据 if  { //http_build_query curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query; } else { curl_setopt($curl, CURLOPT_POSTFIELDS, $param); } } //执行请求 $data = $data_str = curl_exec; //处理错误 if ($error = curl_error { $log_data = array( 'url' => $url, 'param' => $param, 'error' => '' . $error . '', ); var_dump; exit; } # 关闭CURL curl_close; //json数据转换为数组 $data = json_decode; if  { $data = $data_str; } #调用玩接口之后写一个日志 $log = [ 'url' => $url, 'param' => $param, 'response' => $data_str ]; file_put_contents(__DIR__ . '/wechat.log', print_r; return $data; } function arrzxml{ $xml=''; foreach{ if{ $xml.="".$value."".$key.">"; }else{ $xml.="".$key.">"; } } $xml.='';// var_dump;exit; return $xml; } $xml=arrzxml;$result=CurlPost;//echo '

createUrl.php:创建微信二维码支付链接

具体详细代码大家可以参考下:

模式一比较复杂,需要公众号配置回调地址。

createUrl.php:创建微信二维码支付链接

‘;var_dump;exit;$api_arr=json_decode(simplexml_load_string($result,’SimpleXMLElement’,LIBXML_NOCDATA),true);if($result[‘return_code’]==’SUCCESS’){
include __DIR__.’/phpqrcode.php’; header(‘content-type:image/png’);
echo Qrcode::png($api_arr[‘code_url’],false,’H’,6,2); }

returnGoodsUrl.php:用户扫描二维码链接后,微信将链接中的商品ID、openId以及其他信息post到该脚本,该脚本负责返回与商品ID对应的商品信息。OpenId;$AppId = $postObj->AppId;$IsSubscribe = $postObj->IsSubscribe;$ProductId = $postObj->ProductId;$TimeStamp = $postObj->TimeStamp;$NonceStr = $postObj->NonceStr;$AppSignature = $postObj->AppSignature;$SignMethod = $postObj->SignMethod; /** * 第二步,生成订单号,并且和商品信息,用户openID等订单信息保存在数据库中 * */function createTradeId(){ $curDateTime = date; //date_default_timezone_set; $strDate = date; $strTime = date; //4位随机数 $randNum = rand; //10位序列号,可以自行调整。 $strReq = $strTime . $randNum; /* 商家的定单号 */ $mch_vno = $curDateTime . $strReq; /********************/ /*todo 保存订单信息到数据库中*/ /********************/ return $mch_vno;} /** * 第三步:生成商品详情pakage * @param string $body 商品描述 * @param string $total_fee 订单总金额,单位为分。 * @param string $out_trade_no 商户系统内部的订单号 * @return $package */function getPackage($body,$total_fee,$out_trade_no){ $ip=$_SERVER["REMOTE_ADDR"]; if($ip=="::1"||empty{ $ip="127.0.0.1"; } $banktype = "WX"; $fee_type = "1";//费用类型,这里1为默认的人民币 $input_charset = "GBK";//字符集,这里将统一使用GBK $notify_url = "http://xxxxxx.com/Wxpay/notify.html";//支付成功后将通知该地址 $out_trade_no =createTradeId();//订单号,商户需要保证该字段对于本商户的唯一性 $partner = "XXXXXXXX"; //商户号 $spbill_create_ip =$ip;//订单生成的机器IP $partnerKey = "XXXXXXXXXXXXXXXXXXXXXXXXXXX";//这个值和以上其他值不一样是:签名需要它,而最后组成的传输字符串不能含有它。这个key是需要商户好好保存的。 //首先第一步:对原串进行签名,注意这里不要对任何字段进行编码。这里是将参数按照key=value进行字典排序后组成下面的字符串,在这个字符串最后拼接上key=XXXX。由于这里的字段固定,因此只需要按照这个顺序进行排序即可。 $signString = "bank_type=".$banktype."&body=".$body."&fee_type=".$fee_type."&input_charset=".$input_charset."¬ify_url=".$notify_url."&out_trade_no=".$out_trade_no."&partner=".$partner."&spbill_create_ip=".$spbill_create_ip."&total_fee=".$total_fee."&key=".$partnerKey; $md5SignValue = ("" .strtoupper; //echo $md5SignValue; //然后第二步,对每个参数进行url转码。 $banktype = encodeURIComponent; $body=encodeURIComponent; $fee_type=encodeURIComponent; $input_charset = encodeURIComponent; $notify_url = encodeURIComponent; $out_trade_no = encodeURIComponent; $partner = encodeURIComponent; $spbill_create_ip = encodeURIComponent; $total_fee = encodeURIComponent; //然后进行最后一步,这里按照key=value除了sign外进行字典序排序后组成下列的字符串,最后再串接sign=value $completeString = "bank_type=".$banktype."&body=".$body."&fee_type=".$fee_type."&input_charset=".$input_charset."¬ify_url=".$notify_url."&out_trade_no=".$out_trade_no."&partner=".$partner."&spbill_create_ip=".$spbill_create_ip."&total_fee=".$total_fee; $completeString = $completeString."&sign=".$md5SignValue; $oldPackageString = $completeString; //记住package,方便最后进行整体签名时取用 return $completeString;} //模拟js中的encodeURIComponent方法function encodeURIComponent { $revert = array('%21'=>'!', '%2A'=>'*', '%27'=>"'", '%28'=>'; return strtr, $revert);}/**第四步:为了返回Package 数据,回调URL 必须返回一个xml 格式的返回数据,形如: 13697450730 RetErrMsg> SignMethod >对于一些第三方觉得商品已经过期或者其他错误的情况,可以在RetCode 和RetErrMsg 中体现出来,RetCode 为0 表明正确,可以定义其他错误;当定义其他错误时,可以在RetErrMsg 中填上UTF8 编码的错误提示信息,比如“该商品已经下架”,客户端会直接提示出来。 **/ $data=array( "AppId"=>$AppId, "Package"=>getPackage("测试商品",100,"201311291504302501231"), "TimeStamp"=>strtotime(), "NonceStr"=>$NonceStr, "RetCode"=>0, //RetCode 为0 表明正确,可以定义其他错误;当定义其他错误时,可以在RetErrMsg 中填上UTF8 编码的错误提示信息,比如“该商品已经下架”,客户端会直接提示出来。 "RetErrMsg"=>"正确返回", "AppSignature"=>$AppSignature, "SignMethod"=>"sha1");//返回生成的xml数据echo ArrayToXML::arrtoxml;
createUrl.php:创建微信二维码支付链接```/*** @author chantrans* 本页面的作用是生成商品二维码链接*/echo createUrl;/*** 产生随机字符串*/function getNonceStr()$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';$noceStr = "";for ($i = 0; $i < 32; $i++) {$noceStr .= $chars[ mt_rand - 1) ];}$oldNonceStr = $noceStr;return $noceStr;/*** 二维码扫码链接构造方式:* weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXXX&productid=XXXXXX×tamp=XXXXXX&noncestr=XXXXXX*appid 是字段名称:公众号id;字段来源:商户注册具有支付权限的公众号成功后即可获得;传入方式:由商户直接传入。timestamp 是字段名称:时间戳;字段来源:商户生成从1970 年1 月1 日00:00:00 至今的秒数,即当前的时间;由商户生成后传入。取值范围:32 字符以下noncestr 是字段名称:随机字符串;字段来源:商户生成的随机字符串;取值范围:长度为32 个字符以下。由商户生成后传入。取值范围:32 字符以下productid 是字段名称:商品唯一id;字段来源:商户需要定义并维护自己的商品id,这个id 与一张订单等价,微信后台凭借该id 通过Post商户后台获取交易必须信息。由商户生成后传入。取值范围:32字符以下sign 是字段名称:签名;字段来源:对前面的其他字段与appKey 按照字典序排序后,使用SHA1 算法得到的结果。由商户生成后传入。参与sign 签名的字段包括:appid、timestamp、noncestr、productid 以及appkey。*/function createUrl{$app_id = "wxbce29784bdd01454"; //公众号appid$app_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";//公众号支付请求中用于加密的密钥Key,可验证商户唯一身份,PaySignKey对应于支付场景中的appKey值。$nonce_str =getNonceStr();$time_stamp = strtotime;//对所有需要传入的参数加上appkey作一次key=value字典序的排序$keyvaluestring = "app&appkey=".$app_key."&noncestr=".$nonce_str."&product×tamp=".$time_stamp;$sign = sha1."";$url = "weixin://wxpay/bizpayurl?sign=".$sign."&app&product×tamp=".$time_stamp."&noncestr=".$nonce_str."";return $url;```returnGoodsUrl.php:用户扫描二维码链接后,微信将链接中的商品ID、openId以及其他信息post到该脚本,该脚本负责返回与商品ID对应的商品信息。```include 'ArrayToXML.php';/**** 该脚本为当公众该平台接到Native支付请求时,会调用此回调URL获取商品信息。*//**OpenId,点击链接准备购买商品的用户openidIsSubscribe,标记用户是否订阅该公众帐号,1 为关注,0 为未关注AppSignature,参数的加密签名,是根据2.7 支付签名生成方法中所讲的签名方式生成的签名**/$postdata = file_get_contents;$postObj = simplexml_load_string ( $postdata, 'SimpleXMLElement', LIBXML_NOCDATA );$openId = $postObj->OpenId;$AppId = $postObj->AppId;$IsSubscribe = $postObj->IsSubscribe;$ProductId = $postObj->ProductId;$TimeStamp = $postObj->TimeStamp;$NonceStr = $postObj->NonceStr;$AppSignature = $postObj->AppSignature;$SignMethod = $postObj->SignMethod;* 第二步,生成订单号,并且和商品信息,用户openID等订单信息保存在数据库中* */function createTradeId(){$curDateTime = date;//date_default_timezone_set;$strDate = date;$strTime = date;//4位随机数$randNum = rand;//10位序列号,可以自行调整。$strReq = $strTime . $randNum;/* 商家的定单号 */$mch_vno = $curDateTime . $strReq;/********************//*todo 保存订单信息到数据库中*//********************/return $mch_vno;* 第三步:生成商品详情pakage* @param string $body 商品描述 * @param string $total_fee 订单总金额,单位为分。* @param string $out_trade_no 商户系统内部的订单号* @return $package*/function getPackage($body,$total_fee,$out_trade_no){ $ip=$_SERVER["REMOTE_ADDR"];if($ip=="::1"||empty{$ip="127.0.0.1";}$banktype = "WX";$fee_type = "1";//费用类型,这里1为默认的人民币$input_charset = "GBK";//字符集,这里将统一使用GBK$notify_url = "http://xxxxxx.com/Wxpay/notify.html";//支付成功后将通知该地址$out_trade_no =createTradeId();//订单号,商户需要保证该字段对于本商户的唯一性$partner = "XXXXXXXX"; //商户号$spbill_create_ip =$ip;//订单生成的机器IP$partnerKey = "XXXXXXXXXXXXXXXXXXXXXXXXXXX";//这个值和以上其他值不一样是:签名需要它,而最后组成的传输字符串不能含有它。这个key是需要商户好好保存的。//首先第一步:对原串进行签名,注意这里不要对任何字段进行编码。这里是将参数按照key=value进行字典排序后组成下面的字符串,在这个字符串最后拼接上key=XXXX。由于这里的字段固定,因此只需要按照这个顺序进行排序即可。$signString = "bank_type=".$banktype."&body=".$body."&fee_type=".$fee_type."&input_charset=".$input_charset."¬ify_url=".$notify_url."&out_trade_no=".$out_trade_no."&partner=".$partner."&spbill_create_ip=".$spbill_create_ip."&total_fee=".$total_fee."&key=".$partnerKey;$md5SignValue = ("" .strtoupper;//echo $md5SignValue;//然后第二步,对每个参数进行url转码。$banktype = encodeURIComponent;$body=encodeURIComponent;$fee_type=encodeURIComponent;$input_charset = encodeURIComponent;$notify_url = encodeURIComponent;$out_trade_no = encodeURIComponent;$partner = encodeURIComponent;$spbill_create_ip = encodeURIComponent;$total_fee = encodeURIComponent;//然后进行最后一步,这里按照key=value除了sign外进行字典序排序后组成下列的字符串,最后再串接sign=value$completeString = "bank_type=".$banktype."&body=".$body."&fee_type=".$fee_type."&input_charset=".$input_charset."¬ify_url=".$notify_url."&out_trade_no=".$out_trade_no."&partner=".$partner."&spbill_create_ip=".$spbill_create_ip."&total_fee=".$total_fee;$completeString = $completeString."&sign=".$md5SignValue;$oldPackageString = $completeString; //记住package,方便最后进行整体签名时取用return $completeString;function encodeURIComponent {$revert = array('%21'=>'!', '%2A'=>'*', '%27'=>"'", '%28'=>';return strtr, $revert);/**为了返回Package 数据,回调URL 必须返回一个xml 格式的返回数据,形如: 13697450730 RetErrMsg> SignMethod >对于一些第三方觉得商品已经过期或者其他错误的情况,可以在RetCode 和RetErrMsg 中体现出来,RetCode 为0 表明正确,可以定义其他错误;当定义其他错误时,可以在RetErrMsg 中填上UTF8 编码的错误提示信息,比如“该商品已经下架”,客户端会**/$data=array("AppId"=>$AppId,"Package"=>getPackage("测试商品",100,"201311291504302501231"),"TimeStamp"=>strtotime(),"NonceStr"=>$NonceStr,"RetCode"=>0, //RetCode 为0 表明正确,可以定义其他错误;当定义其他错误时,可以在RetErrMsg 中填上UTF8 编码的错误提示信息,比如“该商品已经下架”,客户端会直接提示出来。"RetErrMsg"=>"正确返回","AppSignature"=>$AppSignature,"SignMethod"=>"sha1"//返回生成的xml数据echo ArrayToXML::arrtoxml;notifyUrl.php :用户支付商品后,微信服务器会将商品信息、支付结果、用户的openId等重要信息以get和post方式传递到该链接上,该脚本接收这些信息,并根据支付信息做发货处理,最后返回给微信服务器success,告知他们,我们已经处理到此通知。否则,微信服务器将会定期重新发起通知。 1369743511 SignMethod >// 获取微信通知接口postData信息$postdata = file_get_contents; $postObj = simplexml_load_string ( $postdata, 'SimpleXMLElement', LIBXML_NOCDATA );$trade_state =$_GET ["trade_state"];//支付状态$out_trade_no = $_GET ["out_trade_no"];//订单号/***************** Todo 还有很多其他参数需要保存起来,参数列表详见文档 **************************/echo "success";echo "false";```ArrayToXML.php:该脚本的作用是将数组转换成为xml。createElement; $dom->appendChild;}foreach {$itemx = $dom->createElement?$key:"item");$item->appendChild;if {$text = $dom->createTextNode;$itemx->appendChild;}else {self::arrtoxml;}}return $dom->saveXML();}```

模式二比较简单,只需要在代码中配置回调地址就可以了。

returnGoodsUrl.php:用户扫描二维码链接后,微信将链接中的商品ID、openId以及其他信息post到该脚本,该脚本负责返回与商品ID对应的商品信息。OpenId;$AppId = $postObj->AppId;$IsSubscribe = $postObj->IsSubscribe;$ProductId = $postObj->ProductId;$TimeStamp = $postObj->TimeStamp;$NonceStr = $postObj->NonceStr;$AppSignature = $postObj->AppSignature;$SignMethod = $postObj->SignMethod;/** * 第二步,生成订单号,并且和商品信息,用户openID等订单信息保存在数据库中 * */function createTradeId(){ $curDateTime = date; //date_default_timezone_set; $strDate = date; $strTime = date; //4位随机数 $randNum = rand; //10位序列号,可以自行调整。 $strReq = $strTime . $randNum; /* 商家的定单号 */ $mch_vno = $curDateTime . $strReq; /********************/ /*todo 保存订单信息到数据库中*/ /********************/ return $mch_vno;}/** * 第三步:生成商品详情pakage * @param string $body 商品描述 * @param string $total_fee 订单总金额,单位为分。 * @param string $out_trade_no 商户系统内部的订单号 * @return $package */function getPackage($body,$total_fee,$out_trade_no){ $ip=$_SERVER["REMOTE_ADDR"]; if($ip=="::1"||empty{ $ip="127.0.0.1"; } $banktype = "WX"; $fee_type = "1";//费用类型,这里1为默认的人民币 $input_charset = "GBK";//字符集,这里将统一使用GBK $notify_url = "http://xxxxxx.com/Wxpay/notify.html";//支付成功后将通知该地址 $out_trade_no =createTradeId();//订单号,商户需要保证该字段对于本商户的唯一性 $partner = "XXXXXXXX"; //商户号 $spbill_create_ip =$ip;//订单生成的机器IP $partnerKey = "XXXXXXXXXXXXXXXXXXXXXXXXXXX";//这个值和以上其他值不一样是:签名需要它,而最后组成的传输字符串不能含有它。这个key是需要商户好好保存的。 //首先第一步:对原串进行签名,注意这里不要对任何字段进行编码。这里是将参数按照key=value进行字典排序后组成下面的字符串,在这个字符串最后拼接上key=XXXX。由于这里的字段固定,因此只需要按照这个顺序进行排序即可。 $signString = "bank_type=".$banktype."&body=".$body."&fee_type=".$fee_type."&input_charset=".$input_charset."&notify_url=".$notify_url."&out_trade_no=".$out_trade_no."&partner=".$partner."&spbill_create_ip=".$spbill_create_ip."&total_fee=".$total_fee."&key=".$partnerKey; $md5SignValue = ("" .strtoupper; //echo $md5SignValue; //然后第二步,对每个参数进行url转码。 $banktype = encodeURIComponent; $body=encodeURIComponent; $fee_type=encodeURIComponent; $input_charset = encodeURIComponent; $notify_url = encodeURIComponent; $out_trade_no = encodeURIComponent; $partner = encodeURIComponent; $spbill_create_ip = encodeURIComponent; $total_fee = encodeURIComponent; //然后进行最后一步,这里按照key=value除了sign外进行字典序排序后组成下列的字符串,最后再串接sign=value $completeString = "bank_type=".$banktype."&body=".$body."&fee_type=".$fee_type."&input_charset=".$input_charset."&notify_url=".$notify_url."&out_trade_no=".$out_trade_no."&partner=".$partner."&spbill_create_ip=".$spbill_create_ip."&total_fee=".$total_fee; $completeString = $completeString."&sign=".$md5SignValue; $oldPackageString = $completeString; //记住package,方便最后进行整体签名时取用 return $completeString;}//模拟js中的encodeURIComponent方法function encodeURIComponent { $revert = array('%21'=>'!', '%2A'=>'*', '%27'=>"'", '%28'=>'; return strtr, $revert);}/**第四步:为了返回Package 数据,回调URL 必须返回一个xml 格式的返回数据,形如: 13697450730 RetErrMsg> SignMethod >对于一些第三方觉得商品已经过期或者其他错误的情况,可以在RetCode 和RetErrMsg 中体现出来,RetCode 为0 表明正确,可以定义其他错误;当定义其他错误时,可以在RetErrMsg 中填上UTF8 编码的错误提示信息,比如“该商品已经下架”,客户端会直接提示出来。 **/$data=array( "AppId"=>$AppId, "Package"=>getPackage("测试商品",100,"201311291504302501231"), "TimeStamp"=>strtotime(), "NonceStr"=>$NonceStr, "RetCode"=>0, //RetCode 为0 表明正确,可以定义其他错误;当定义其他错误时,可以在RetErrMsg 中填上UTF8 编码的错误提示信息,比如“该商品已经下架”,客户端会直接提示出来。 "RetErrMsg"=>"正确返回", "AppSignature"=>$AppSignature, "SignMethod"=>"sha1");//返回生成的xml数据echo ArrayToXML::arrtoxml;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

notifyUrl.php
:用户支付商品后,微信服务器会将商品信息、支付结果、用户的openId等重要信息以get和post方式传递到该链接上,该脚本接收这些信息,并根据支付信息做发货处理,最后返回给微信服务器success,告知他们,我们已经处理到此通知。否则,微信服务器将会定期重新发起通知。

以上所述是小编给大家介绍的PHP
微信扫码支付源代码,数据库显示空白的完美解决方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

我这次使用的是模式二。

notifyUrl.php
用户支付商品后,微信服务器会将商品信息、支付结果、用户的openId等重要信息以get和post方式传递到该链接上,该脚本接收这些信息,并根据支付信息做发货处理,最后返回给微信服务器success,告知他们,我们已经处理到此通知。否则,微信服务器将会定期重新发起通知。

1 1369743511 SignMethod >商户需要对这些参数进行保存和判断用户的支付状态*/// 获取微信通知接口postData信息$postdata = file_get_contents;$postObj = simplexml_load_string ( $postdata, 'SimpleXMLElement', LIBXML_NOCDATA );$trade_state =$_GET ["trade_state"];//支付状态$out_trade_no = $_GET ["out_trade_no"];//订单号/***************** Todo 还有很多其他参数需要保存起来,参数列表详见文档 **************************/if{ echo "success";}else{ echo "false";}
const APPID = 'xxx';const MCHID = 'xxx';const KEY = 'xxx';const APPSECRET = 'xxx';
1 1369743511 SignMethod >商户需要对这些参数进行保存和判断用户的支付状态*/// 获取微信通知接口postData信息$postdata = file_get_contents; $postObj = simplexml_load_string ( $postdata, 'SimpleXMLElement', LIBXML_NOCDATA );$trade_state =$_GET ["trade_state"];//支付状态$out_trade_no = $_GET ["out_trade_no"];//订单号/***************** Todo 还有很多其他参数需要保存起来,参数列表详见文档 **************************/if{ echo "success";}else{ echo "false";}

ArrayToXML.php:该脚本的作用是将数组转换成为xml。

配置公众号的appid,appsecret。以及微信支付的mchid与key。

ArrayToXML.php:该脚本的作用是将数组转换成为xml。

createElement; $dom->appendChild; } foreach { $itemx = $dom->createElement?$key:"item"); $item->appendChild; if { $text = $dom->createTextNode; $itemx->appendChild; }else { self::arrtoxml; } } return $dom->saveXML(); }}

生成二维码,这个页面需要自己去美化,不像支付宝那样自带效果。

createElement; $dom->appendChild; } foreach { $itemx = $dom->createElement?$key:"item"); $item->appendChild; if { $text = $dom->createTextNode; $itemx->appendChild; }else { self::arrtoxml; } } return $dom->saveXML(); }}

以上就是本实例的全部内容了,希望大家能喜欢

require_once "./phpcms/plugin/weixinpay/lib/WxPay.Api.php";require_once "./phpcms/plugin/weixinpay/example/WxPay.NativePay.php";require_once './phpcms/plugin/weixinpay/example/log.php';$input = new WxPayUnifiedOrder();$input->SetBody('预订'.$product_info['name'].'订单');$input->SetAttach('预订'.$product_info['name'].'订单');$input->SetOut_trade_no($order_info['orderno']);$input->SetTotal_fee($order_info['payprice'] * 100);$input->SetTime_start;$input->SetTime_expire + 600));$input->SetGoods_tag;$input->SetNotify_url("http://www.ayuanduanzu.com/wxpay/notify.php"); // 地址是外网能访问的,且不能包含参数$input->SetTrade_type;$input->SetProduct_id;$notify = new NativePay();$result = $notify->GetPayUrl;$code_url = $result["code_url"];

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

这里的回调地址很有讲究,扫码支付成功后,微信会自动调用这个地址。这个地址不能包含任何参数,否则调用失败。啥都看不到!

微信调用的时候,会传递xml类型的参数。

include_once "../phpcms/base.php";// 处理回调数据error_reporting;require_once "../phpcms/plugin/weixinpay/lib/WxPay.Api.php";require_once '../phpcms/plugin/weixinpay/lib/WxPay.Notify.php';require_once '../phpcms/plugin/weixinpay/example/log.php';//初始化日志$logHandler= new CLogFileHandler("../logs/".date;$log = Log::Init;class PayNotifyCallBack extends WxPayNotify//查询订单public function Queryorder{$input = new WxPayOrderQuery();$input->SetTransaction_id;$result = WxPayApi::orderQuery;Log::DEBUG("query:" . json_encode;if(array_key_exists("return_code", $result)&& array_key_exists("result_code", $result)&& $result["return_code"] == "SUCCESS"&& $result["result_code"] == "SUCCESS"){return true;}return false;}//重写回调处理函数public function NotifyProcess{Log::DEBUG("call back:" . json_encode;$notfiyOutput = array();if(!array_key_exists("transaction_id", $data)){$msg = "输入参数不正确";return false;}//查询订单,判断订单真实性if(!$this->Queryorder($data["transaction_id"])){$msg = "订单查询失败";return false;}return true;}Log::DEBUG;$notify = new PayNotifyCallBack();$ilog_db = pc_base::load_model;$order_db = pc_base::load_model;$postXml = $GLOBALS["HTTP_RAW_POST_DATA"];$postArr = xmlToArray;// 查询是否支付成功$r = $notify->Queryorder($postArr['transaction_id']);if  {// 获取订单信息$order_info = $order_db->get_one(array('orderno'=>$postArr['out_trade_no']));if ($order_info['pay_status'] != '1') {$data['pay_status'] = '1';$data['pay_type'] = 'weixinpay';$data['pay_code'] = $postArr['transaction_id'];$data['paytime'] = time();$data['order_status']= 3; // 已支付$order_db->update($data,array('orderno'=>$postArr['out_trade_no']));}?>

$GLOBALS["HTTP_RAW_POST_DATA"];

可以获取微信端传入的参数

{"appid": "wxed7996e9ad58345d","attach": "u9884u8ba2u5bbfu8fc1u00b7u592au53e4u91ccu7f8eu5f0fu5957u623fu8ba2u5355","bank_type": "CFT","cash_fee": "1","fee_type": "CNY","is_subscribe": "Y","mch_id": "1283301801","nonce_str": "20xn5e0lbk2u1u6pes2uonape2sdyfs4","openid": "oR8C7wsknwVELIRrzTlZX2eONWeY","out_trade_no": "2016091455521024608","result_code": "SUCCESS","return_code": "SUCCESS","sign": "95C2C532D095E7BF7588522C579758C4","time_end": "20160914135518","total_fee": "1","trade_type": "NATIVE","transaction_id": "4009602001201609143926590576"}

查询是否已支付,支付完成的话,进行订单数据处理。

这里的一切都是异步的,二维码页面啥都看不到。

只能通过异步获取订单状态来判断是否操作成功。

// 检测是否支付成功$.ready {setInterval; function ajaxstatus() {var orderno = $.val {$.ajax({url: "?m=home&c=order&a=ajax",type: "GET",dataType:"json",data: {todo: 'ajaxCheckWxPay',orderno: orderno,},success: function  {if  { //订单状态为1表示支付成功layer.msg('支付成功',{icon:1,time: 2000},function(){window.location.href = "?m=home&c=order&a=payDone&orderno="+json.info['orderno'];});// window.location.href = "wxScanSuccessUrl.action"; //页面跳转}}});}}

三秒执行一次,如果成功,进行跳转处理。

* 作用:array转xml*/function arrayToXml$xml = "";foreach {if {$xml.="".$val."".$key.">"; }else$xml.="".$key.">"; }$xml.="";return $xml; * 作用:将xml转为array*/function xmlToArray{ //将XML转为array $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $array_data;}

对于异步的调用,如果看不到效果。可以建一个日志表,把操作的数据记录在表中。便于测试。支付回调都是异步的,可以通过日志表中的数据来判断是否支付成功,是否调用了回调,调用了几次。

小结:

微信扫码支付不如支付宝扫码支付便捷。需要自己做很多处理。

以上所述是小编给大家介绍的PHP
微信扫码支付接入总结,数据库显示空白的完美解决方案,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图