如何编写PHP微信支付类demo
发表于:2024-09-21 作者:千家信息网编辑
千家信息网最后更新 2024年09月21日,本篇内容主要讲解"如何编写PHP微信支付类demo",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何编写PHP微信支付类demo"吧!
千家信息网最后更新 2024年09月21日如何编写PHP微信支付类demo
本篇内容主要讲解"如何编写PHP微信支付类demo",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何编写PHP微信支付类demo"吧!
mchid = $mchid; // 微信支付商户号 PartnerID 通过微信支付商户资料审核后邮件发送 $this->appid = $appid; //公众号APPID 通过微信支付商户资料审核后邮件发送 $this->key = $key; //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥 } /** * @param string $openid 调用【网页授权获取用户信息】接口获取到用户在该公众号下的Openid * @param float $totalFee 收款总费用 单位元 * @param string $outTradeNo 唯一的订单号 * @param string $orderName 订单名称 * @param string $notifyUrl 支付结果通知url 不要有问号 * https://mp.weixin.qq.com/ 微信支付-开发配置-测试目录 * 测试目录 http://mp.izhanlue.com/paytest/ 最后需要斜线,(需要精确到二级或三级目录) * @return string */ public function createJsBizPackage($openid, $totalFee, $outTradeNo, $orderName, $notifyUrl, $timestamp) { $config = array( 'mch_id' => $this->mchid, 'appid' => $this->appid, 'key' => $this->key, ); $unified = array( 'appid' => $config['appid'], 'attach' => '支付', //商家数据包,原样返回 'body' => $orderName, 'mch_id' => $config['mch_id'], 'nonce_str' => self::createNonceStr(), 'notify_url' => $notifyUrl, 'openid' => $openid, //rade_type=JSAPI,此参数必传 'out_trade_no' => $outTradeNo, 'spbill_create_ip' => '127.0.0.1', 'total_fee' => intval($totalFee * 100), //单位 转为分 'trade_type' => 'JSAPI', ); $unified['sign'] = self::getSign($unified, $config['key']); $responseXml = self::curlPost('https://api.mch.weixin.qq.com/pay/unifiedorder', self::arrayToXml($unified)); /**/ $unifiedOrder = simplexml_load_string($responseXml, 'SimpleXMLElement', LIBXML_NOCDATA); if ($unifiedOrder === false) { die('parse xml error'); } if ($unifiedOrder->return_code != 'SUCCESS') { die($unifiedOrder->return_msg); } if ($unifiedOrder->result_code != 'SUCCESS') { die($unifiedOrder->err_code); /* NOAUTH 商户无此接口权限 NOTENOUGH 余额不足 ORDERPAID 商户订单已支付 ORDERCLOSED 订单已关闭 SYSTEMERROR 系统错误 APPID_NOT_EXIST APPID不存在 MCHID_NOT_EXIST MCHID不存在 APPID_MCHID_NOT_MATCH appid和mch_id不匹配 LACK_PARAMS 缺少参数 OUT_TRADE_NO_USED 商户订单号重复 SIGNERROR 签名错误 XML_FORMAT_ERROR XML格式错误 REQUIRE_POST_METHOD 请使用post方法 POST_DATA_EMPTY post数据为空 NOT_UTF8 编码格式错误 */ } //$unifiedOrder->trade_type 交易类型 调用接口提交的交易类型,取值如下:JSAPI,NATIVE,APP //$unifiedOrder->prepay_id 预支付交易会话标识 微信生成的预支付回话标识,用于后续接口调用中使用,该值有效期为2小时 //$unifiedOrder->code_url 二维码链接 trade_type为NATIVE是有返回,可将该参数值生成二维码展示出来进行扫码支付 $arr = array( "appId" => $config['appid'], "timeStamp" => $timestamp, "nonceStr" => self::createNonceStr(), "package" => "prepay_id=" . $unifiedOrder->prepay_id, "signType" => 'MD5', ); $arr['paySign'] = self::getSign($arr, $config['key']); return $arr; } public function notify() { $config = array( 'mch_id' => $this->mchid, 'appid' => $this->appid, 'key' => $this->key, ); $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; //error_log($postStr, 3, './str.txt'); /* $postStr = ' '; */ $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA); if ($postObj === false) { die('parse xml error'); } if ($postObj->return_code != 'SUCCESS') { die($postObj->return_msg); } if ($postObj->result_code != 'SUCCESS') { die($postObj->err_code); } $arr = (array)$postObj; unset($arr['sign']); if (self::getSign($arr, $config['key']) == $postObj->sign) { // $mch_id = $postObj->mch_id; //微信支付分配的商户号 // $appid = $postObj->appid; //微信分配的公众账号ID // $openid = $postObj->openid; //用户在商户appid下的唯一标识 // $transaction_id = $postObj->transaction_id;//微信支付订单号 // $out_trade_no = $postObj->out_trade_no;//商户订单号 // $total_fee = $postObj->total_fee; //订单总金额,单位为分 // $is_subscribe = $postObj->is_subscribe; //用户是否关注公众账号,Y-关注,N-未关注,仅在公众账号类型支付有效 // $attach = $postObj->attach;//商家数据包,原样返回 // $time_end = $postObj->time_end;//支付完成时间 echo ' 1 '; return $postObj; } } /** * curl get * * @param string $url * @param array $options * @return mixed */ public static function curlGet($url = '', $options = array()) { $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 30); if (!empty($options)) { curl_setopt_array($ch, $options); } //https请求 不验证证书和host curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $data = curl_exec($ch); curl_close($ch); return $data; } public static function curlPost($url = '', $postData = '', $options = array()) { if (is_array($postData)) { $postData = http_build_query($postData); } $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); curl_setopt($ch, CURLOPT_TIMEOUT, 30); //设置cURL允许执行的最长秒数 if (!empty($options)) { curl_setopt_array($ch, $options); } //https请求 不验证证书和host curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $data = curl_exec($ch); curl_close($ch); return $data; } public static function createNonceStr($length = 16) { $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $str = ''; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } public static function arrayToXml($arr) { $xml = " "; foreach ($arr as $key => $val) { if (is_numeric($val)) { $xml .= "<" . $key . ">" . $val . "" . $key . ">"; } else $xml .= "<" . $key . ">" . $key . ">"; } $xml .= " "; return $xml; } /** * 例如: * appid: wxd930ea5d5a258f4f * mch_id: 10000100 * device_info: 1000 * Body: test * nonce_str: ibuaiVcKdpRxkhJA * 第一步:对参数按照 key=value 的格式,并按照参数名 ASCII 字典序排序如下: * stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_i * d=10000100&nonce_str=ibuaiVcKdpRxkhJA"; * 第二步:拼接支付密钥: * stringSignTemp="stringA&key=192006250b4c09247ec02edce69f6a2d" * sign=MD5(stringSignTemp).toUpperCase()="9A0A8659F005D6984697E2CA0A9CF3B7" */ public static function getSign($params, $key) { ksort($params, SORT_STRING); $unSignParaString = self::formatQueryParaMap($params, false); $signStr = strtoupper(md5($unSignParaString . "&key=" . $key)); return $signStr; } protected static function formatQueryParaMap($paraMap, $urlEncode = false) { $buff = ""; ksort($paraMap); foreach ($paraMap as $k => $v) { if (null != $v && "null" != $v) { if ($urlEncode) { $v = urlencode($v); } $buff .= $k . "=" . $v . "&"; } } $reqPar = ''; if (strlen($buff) > 0) { $reqPar = substr($buff, 0, strlen($buff) - 1); } return $reqPar; }}
到此,相信大家对"如何编写PHP微信支付类demo"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
支付
商户
订单
公众
参数
接口
用户
订单号
错误
单位
密钥
数据
标识
格式
目录
类型
账号
交易
有效
安全
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
java高级软件开发工程师招聘
闵行区通信网络技术包括什么
监控服务器需要怎么设置
pc应用软件开发环境
黄冈网络安全工程师
数据库与可视化管理
山西职业软件开发信息推荐
vba数据库登录页面
上海个人软件开发售后服务
服务器有没有安全模式
武都软件开发技术
数据库金额字段保留两位小数
南通博菲克网络技术有限公司
有什么好的软件开发客户
网络安全比赛与禁毒有什么关系
软件开发具体做啥
一个数据库至少由
QT通过数据库编码建立树型目录
字帖软件开发
怎么弄主服务器和副服务器
海康蜂鸟服务器管理平台
华润网络安全周
mysql 示例数据库
h3c执行结果写入数据库
服务器操作系统正版分类
建立服务器集群
小说码字软件开发
山东服务器电源要多少钱
易建联男篮数据库
网络安全知识要写什么