千家信息网

PHP如何实现微信扫码支付

发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要介绍了PHP如何实现微信扫码支付,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。代码中包含四个文件createUrl.php
千家信息网最后更新 2025年01月18日PHP如何实现微信扫码支付

这篇文章主要介绍了PHP如何实现微信扫码支付,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

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

代码:

createUrl.php:创建微信二维码支付链接```/*** @author chantrans* 本页面的作用是生成商品二维码链接*/echo createUrl("12314124");/*** 产生随机字符串*/function getNonceStr()$chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';$noceStr = "";for ($i = 0; $i < 32; $i++) {$noceStr .= $chars[ mt_rand(0, strlen($chars) - 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($productid){$app_id = "wxbce29784bdd01454"; //公众号appid$app_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";//公众号支付请求中用于加密的密钥Key,可验证商户唯一身份,PaySignKey对应于支付场景中的appKey值。$nonce_str =getNonceStr();$time_stamp = strtotime("now");//对所有需要传入的参数加上appkey作一次key=value字典序的排序$keyvaluestring = "appid=".$app_id."&appkey=".$app_key."&noncestr=".$nonce_str."&productid=".$productid."×tamp=".$time_stamp;$sign = sha1($keyvaluestring)."";$url = "weixin://wxpay/bizpayurl?sign=".$sign."&appid=".$app_id."&productid=".$productid."×tamp=".$time_stamp."&noncestr=".$nonce_str."";return $url;```returnGoodsUrl.php:用户扫描二维码链接后,微信将链接中的商品ID、openId以及其他信息post到该脚本,该脚本负责返回与商品ID对应的商品信息。```include 'ArrayToXML.php';/**** 该脚本为当公众该平台接到Native(原生)支付请求时,会调用此回调URL获取商品信息。*//**(1)OpenId,点击链接准备购买商品的用户openid(3)IsSubscribe,标记用户是否订阅该公众帐号,1 为关注,0 为未关注(5)TimeStamp,时间戳(7)AppSignature,参数的加密签名,是根据2.7 支付签名(paySign)生成方法中所讲的签名方式生成的签名**/$postdata = file_get_contents("php://input");$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("YmdHis");//date_default_timezone_set(PRC);$strDate = date("Ymd");$strTime = date("His");//4位随机数$randNum = rand(1000, 9999);//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)){$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(md5(($signString))));//echo $md5SignValue;//然后第二步,对每个参数进行url转码。$banktype = encodeURIComponent($banktype);$body=encodeURIComponent($body);$fee_type=encodeURIComponent($fee_type);$input_charset = encodeURIComponent($input_charset);$notify_url = encodeURIComponent($notify_url);$out_trade_no = encodeURIComponent($out_trade_no);$partner = encodeURIComponent($partner);$spbill_create_ip = encodeURIComponent($spbill_create_ip);$total_fee = encodeURIComponent($total_fee);//然后进行最后一步,这里按照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($str) {$revert = array('%21'=>'!', '%2A'=>'*', '%27'=>"'", '%28'=>'(', '%29'=>')');return strtr(rawurlencode($str), $revert);/**为了返回Package 数据,回调URL 必须返回一个xml 格式的返回数据,形如: 13697450730对于一些第三方觉得商品已经过期或者其他错误的情况,可以在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($data);notifyUrl.php :用户支付商品后,微信服务器会将商品信息、支付结果、用户的openId等重要信息以get和post方式传递到该链接上,该脚本接收这些信息,并根据支付信息做发货处理,最后返回给微信服务器success,告知他们,我们已经处理到此通知。否则,微信服务器将会定期重新发起通知。 1369743511// 获取微信通知接口postData信息$postdata = file_get_contents("php://input"); $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("xml"); $dom->appendChild($item);}foreach ($arr as $key=>$val){$itemx = $dom->createElement(is_string($key)?$key:"item");$item->appendChild($itemx);if (!is_array($val)){$text = $dom->createTextNode($val);$itemx->appendChild($text);}else {self::arrtoxml($val,$dom,$itemx);}}return $dom->saveXML();}```

感谢你能够认真阅读完这篇文章,希望小编分享的"PHP如何实现微信扫码支付"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

支付 信息 商品 订单 数据 错误 字符 参数 商户 字符串 生成 篇文章 订单号 字段 接口 服务器 用户 编码 链接 排序 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 固态硬盘怎么看写入数据库 网络技术四级题型 数据库服务费属于无形资产 计算机网络技术职业岗位有哪些 软件开发质保期一般几年法律规定 量化交易如何挂阿里云服务器 锦湖软件开发 服务器主板怎么装风扇 如何按照规则进行数据库筛选 福建工程软件开发公司哪家好 六安软件开发定制 王者荣耀每个服务器互通吗 一手国外邮箱数据库 网络安全赛道投资人和创业者 绍兴软件开发驻场正规平台 安徽互联网软件开发哪家正规 我国网络安全的状况 数控机床应用软件开发 惠普服务器ilo5使用 服务器推送消息到pc 苏州校园报修管理软件开发 apk软件开发招聘 数据库黑框如何进入 软件开发的模型包括哪些 中山大学网络安全学院宿舍 昂楷网络安全性 为什么公众号总是显示服务器错误 discuz 帖子数据库 数据库个人总结 数据库应用及技术是啥课程
0