第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > 微信支付统一下单 用PHP怎么实现?(代码全)

微信支付统一下单 用PHP怎么实现?(代码全)

时间:2021-08-07 00:28:04

相关推荐

微信支付统一下单 用PHP怎么实现?(代码全)

微信小程序|微信开发

php,微信,微信支付

微信小程序-微信开发

H5支付时出现“签名错误”怎么办?注意调用微信“统一下单”接口后返回pre_pay_id后,需要用户再次进行签名返回给HTML; “支付目录没有授权”,进入微信商家管理后台设置即可。

css轮换源码,vscode配置最大长度,ubuntu转换视频,tomcat扫描war,安卓sqlite开发教学,一个项目前端用多个开发框架,vue写的网页会被爬虫吗,php随机生成字母,宁波seo排名价格,java 小说网站 源代码,网页特效jquery特效图片,zblog游戏模板lzw

A、Model层,Wxpay.php

记账app源码,vscode绘图教程,ubuntu提示版本过期,代码启动tomcat,打开手机sqlite,wordpress 豆瓣插件,gui前端框架要钱吗,xpath爬虫教程,php echo php,seo优化 培训,政府网站织梦模板,网页导航菜单 下拉,html带导航模板,页面内容逐渐加载效果,jsp宿舍信息管理系统,机票预定小程序源码下载lzw

appid = $appid; if(!empty($secret)) $this->secret = $secret; if(!empty($mchid))$this->mchid = $mchid; if(!empty($key)) $this->key= $key; } /** 微信内H5调起支付* @params string $openid : 微信用户openid* @params string $out_trade_no : 商家生成的订单号(唯一性)* @params int $total_fee : 支付金额,单位分* return array $ret : 返回支付时所需要的数据* */ public function payForWeixin($openid,$out_trade_no,$total_fee,$attach=微信支付,$body=微信支付) { //支付数据 $data[openid] = $openid; $data[out_trade_no] = $out_trade_no; $data[ otal_fee] = $total_fee*100; $data[spbill_create_ip] = $_SERVER["REMOTE_ADDR"]; $data[attach] = $attach; $data[ody] = $body; $data[appid] = $this->appid; $data[mch_id] = $this->mchid; $data[ once_str] = random(12); $data[ rade_type] = "JSAPI"; $data[ otify_url] = "http://****.com/home/wxpaynofiy/notify.html"; $sign = $this->getParam($data); $dataXML = " ".$data[appid]." ".$data[attach]." ".$data[ody]." ".$data[mch_id]." ".$data[ once_str]." ".$data[ otify_url]." ".$data[openid]." ".$data[out_trade_no]." ".$data[spbill_create_ip]." ".$data[ otal_fee]." ".$data[ rade_type]." ".$sign." "; $url = https://api.mch./pay/unifiedorder; $result = $this->https_post($url,$dataXML); $ret = $this->xmlToArray($result);if($ret[ eturn_code] == SUCCESS && $ret[ eturn_msg] == OK) { return array(appId=> $this->appid, imeStamp => time(), onceStr => $data[ once_str],package => prepay_id=.$ret[prepay_id],signType => MD5,paySign => $sign ); } else { $this->errorLog("微信支付失败,",$ret); return null; } }/** 微信二维码支付* @params string $openid : 用户的openid* @params string $out_trade_no : 商户订单号* @params number $total_fee : 订单金额,单位分* return string $code_url : 二维码URL链接*/ public function payForQrcode($out_trade_no,$total_fee,$body="魔盒CMS",$attach="微信支付") { //支付数据 $data[out_trade_no] = $out_trade_no; $data[ otal_fee] = $total_fee*100; $data[spbill_create_ip] = $_SERVER["REMOTE_ADDR"]; $data[attach] = $attach; $data[ody] = $body; $data[appid] = $this->appid; $data[mch_id] = $this->mchid; $data[ once_str] = random(12); $data[ rade_type] = "NATIVE"; $data[ otify_url] = "http://****.com/home/wxpaynofiy/notify.html"; $sign = $this->getParam($data); $dataXML = " ".$data[appid]." ".$data[attach]." ".$data[ody]." ".$data[mch_id]." ".$data[ once_str]." ".$data[ otify_url]." ".$data[out_trade_no]." ".$data[spbill_create_ip]." ".$data[ otal_fee]." ".$data[ rade_type]." ".$sign." "; $url = https://api.mch./pay/unifiedorder; $result = $this->https_post($url,$dataXML); $ret = $this->xmlToArray($result); if($ret[ eturn_code] == SUCCESS && $ret[ eturn_msg] == OK) { return $ret[code_url]; } else { $this->errorLog("获取微信支付二维码失败,",$ret); return null; } } /** 订单查询* @params string $transaction_id : 微信订单号* @params string $out_trade_no : 商家订单号(与微信订单号二选一)* */ public function findOrder($out_trade_no) { $data[appid] = $this->appid; $data[mch_id] = $this->mchid; $data[ once_str] = random(12); $data[out_trade_no] = $out_trade_no; $sign = $this->getParam($data); $dataXML = " ".$data[appid]." ".$data[mch_id]." ".$data[ once_str]." ".$data[out_trade_no]." ".$sign." "; $url = https://api.mch./pay/orderquery; $result = $this->https_post($url,$dataXML); $ret = $this->xmlToArray($result); if($ret[ eturn_code] == SUCCESS && $ret[ eturn_msg] == OK) { return $ret; } else { $this->errorLog("查询微信支付订单失败,",$ret); return null; } } /* * 退款订单查询 * @params string $transaction_id : 微信订单号 * @params string $out_trade_no : 商家订单号(与微信订单号二选一) * */ public function findRefundOrder($out_trade_no) { $data[appid] = $this->appid; $data[mch_id] = $this->mchid; $data[ once_str] = random(12); $data[out_trade_no] = $out_trade_no; $sign = $this->getParam($data); $dataXML = " ".$data[appid]." ".$data[mch_id]." ".$data[ once_str]." ".$data[out_trade_no]." ".$sign." "; $url = https://api.mch./pay/refundquery; $result = $this->https_post($url,$dataXML); $ret = $this->xmlToArray($result); if($ret[ eturn_code] == SUCCESS && $ret[ eturn_msg] == OK) { return $ret; } else { $this->errorLog("查询微信支付退款订单失败,",$ret); return $ret[err_code_des]; } } /** 申请退款* @params string $out_trade_no : 商户订单号* @params string $out_refund_no : 商户退款单号* @params int $total_fee : 订单金额* @params int $refund_fee : 退款金额* @params string $refund_desc : 退款原因* */ public function refund($out_trade_no,$out_refund_no,$total_fee,$refund_fee,$refund_desc=退款) { $data[appid] = $this->appid; $data[mch_id] = $this->mchid; $data[ once_str] = random(12); $data[out_trade_no] = $out_trade_no; $data[out_refund_no] = $out_refund_no; $data[ otal_fee] = $total_fee*100; $data[ efund_fee] = $refund_fee*100; $data[ efund_desc] = $refund_desc; $data[ otify_url] = "http://*****.com/home/wxpaynofiy/refund.html"; $sign = $this->getParam($data); $dataXML = " ".$data[appid]." ".$data[mch_id]." ".$data[ once_str]." ".$data[out_trade_no]." ".$data[out_refund_no]." ".$data[ otal_fee]." ".$data[ efund_fee]." ".$data[ efund_desc]." ".$data[ otify_url]." ".$sign." "; $url = https://api.mch./secapi/pay/refund; $result = $this->https_post($url,$dataXML,true); $ret = $this->xmlToArray($result); if($ret[ eturn_code] == SUCCESS && $ret[ eturn_msg] == OK) { return $ret; } else { $this->errorLog("微信退款失败,",$ret); return null; } } /** 企业付款至用户零钱* @params string $openid : 用户openid* @params int $total_fee : 付款金额,单位分* @params string $out_trade_no : 商家订单号* @params string $username : 微信用户名称(注意微信昵称若为空时支付会出错)* @params string $desc : 付款描述* @params string $check_name : 是否检测用户名* */ public function payForUser($openid,$total_fee,$out_trade_no,$username=魔盒CMS,$desc=魔盒CMS付款给用户,$check_name=NO_CHECK) { $data[amount] = $total_fee*100; $data[check_name] = $check_name; $data[desc] = $desc; $data[mch_appid] = $this->appid; $data[mchid] = $this->mchid; $data[ once_str] = random(12); $data[openid] = $openid; $data[partner_trade_no] = $out_trade_no; $data[ e_user_name] = $username; $data[spbill_create_ip] = $_SERVER["REMOTE_ADDR"]; $sign = $this->getParam($data); $dataXML=" ".$data[mch_appid]." ".$data[mchid]." ".$data[ once_str]." ".$data[partner_trade_no]." ".$data[openid]." ".$data[check_name]." ".$data[ e_user_name]." ".$data[amount]." ".$data[desc]." ".$data[spbill_create_ip]." ".$sign." "; $url = https://api.mch./mmpaymkttransfers/promotion/transfers; $result = $this->https_post($url,$dataXML,true); $ret = $this->xmlToArray($result); if($ret[ eturn_code]==SUCCESS && $ret[ esult_code] == SUCCESS) { //支付成功返回商户订单号、微信订单号、微信支付成功时间 $result[partner_trade_no] = $ret[partner_trade_no]; $result[payment_no] = $ret[payment_no]; $result[payment_time] = $ret[payment_time]; return $ret; } else { $this->errorLog(付款给用户失败,$ret); return null; } }/** 普通红包* @params string $out_trade_no : 商家订单号* @params string $openid : 接收红包用户的openid* @params int $total_fee : 红包金额,单位分* @params int $total_num : 红包发放总人数* @params string $wishing : 红包祝福语* @params string $act_name : 活动名称* @params string $remark : 备注* @params string $scene_id :场景值ID。发放红包使用场景,红包金额大于200或者小于1元时必传。PRODUCT_1:商品促销、PRODUCT_2:抽奖、PRODUCT_3:虚拟物品兑奖 、PRODUCT_4:企业内部福利、PRODUCT_5:渠道分润、PRODUCT_6:保险回馈、PRODUCT_7:彩票派奖、PRODUCT_8:税务刮奖* */ public function redPack($openid,$total_fee,$out_trade_no,$total_num = 1,$wishing = 感谢您光临***平台进行购物,$act_name=***购物发红包,$remark = 购物领红包) { $data[mch_billno]= $out_trade_no; $data[mch_id] = $this->mchid; $data[wxappid] = $this->appid; $data[send_name]= 发送红包者的名称; $data[ e_openid]= $openid; $data[ otal_amount] = $total_fee; $data[ otal_num]= $total_num; $data[wishing] = $wishing; $data[client_ip]= $_SERVER["REMOTE_ADDR"]; $data[act_name] = $act_name; $data[ emark] = $remark; $data[ once_str]= random(12); $sign = $this->getParam($data); $dataXML=" ".$sign." ".$data[mch_billno]." ".$data[mch_id]." ".$data[wxappid]." ".$data[send_name]." ".$data[ e_openid]." ".$data[ otal_amount]." ".$data[ otal_num]." ".$data[wishing]." ".$data[client_ip]." ".$data[act_name]." ".$data[ emark]." ".$data[ once_str]." "; $url = https://api.mch./mmpaymkttransfers/sendredpack; $result = $this->https_post($url,$dataXML,true); $ret = $this->xmlToArray($result); if($ret[ eturn_code]==SUCCESS && $ret[ esult_code] == SUCCESS) { return $ret; } else { $this->errorLog(发放普通红包失败,$ret); return $ret[err_code_des]; } } /* * 裂变红包:一次可以发放一组红包。首先领取的用户为种子用户,种子用户领取一组红包当中的一个,并可以通过社交分享将剩下的红包给其他用户。* 裂变红包充分利用了人际传播的优势。 * @params string $out_trade_no : 商家订单号 * @params string $openid : 接收红包用户的openid * @params int $total_fee : 红包金额,单位分 * @params int $total_num : 红包发放总人数 * @params string $wishing : 红包祝福语 * @params string $act_name : 活动名称 * @params string $remark : 备注 * @params string $scene_id :场景值ID。发放红包使用场景,红包金额大于200或者小于1元时必传。PRODUCT_1:商品促销、PRODUCT_2:抽奖、PRODUCT_3:虚拟物品兑奖 、PRODUCT_4:企业内部福利、PRODUCT_5:渠道分润、PRODUCT_6:保险回馈、PRODUCT_7:彩票派奖、PRODUCT_8:税务刮奖 * */ public function redPackGroup($openid,$total_fee,$out_trade_no,$total_num,$wishing = 感谢您光临***进行购物,$act_name=**购物发红包,$remark = 购物领红包) { $data[mch_billno]= $out_trade_no; $data[mch_id] = $this->mchid; $data[wxappid] = $this->appid; $data[send_name]= 发送红包者的名称; $data[ e_openid]= $openid; $data[ otal_amount] = $total_fee; $data[amt_type] = ALL_RAND; //ALL_RAND—全部随机,商户指定总金额和红包发放总人数,由微信支付随机计算出各红包金额 $data[ otal_num]= $total_num; $data[wishing] = $wishing; $data[client_ip]= $_SERVER["REMOTE_ADDR"]; $data[act_name] = $act_name; $data[ emark] = $remark; $data[ once_str]= random(12); $sign = $this->getParam($data); $dataXML=" ".$sign." ".$data[mch_billno]." ".$data[mch_id]." ".$data[wxappid]." ".$data[send_name]." ".$data[ e_openid]." ".$data[ otal_amount]." ".$data[amt_type]." ".$data[ otal_num]." ".$data[wishing]." ".$data[client_ip]." ".$data[act_name]." ".$data[ emark]." ".$data[ once_str]." "; $url = https://api.mch./mmpaymkttransfers/sendgroupredpack; $result = $this->https_post($url,$dataXML,true); $ret = $this->xmlToArray($result); if($ret[ eturn_code]==SUCCESS && $ret[ esult_code] == SUCCESS) { return $ret; } else { $this->errorLog(发放裂变红包失败,$ret); return $ret[err_code_des]; } } /** 查询红包记录* @params string $out_trade_no : 商家订单号* */ public function findRedPack($out_trade_no) { $data[mch_billno]= $out_trade_no; $data[mch_id] = $this->mchid; $data[appid]= $this->appid; $data[ill_type]= MCHT; //MCHT:通过商户订单号获取红包信息。 $data[ once_str]= random(12); $sign = $this->getParam($data); $dataXML=" ".$sign." ".$data[mch_billno]." ".$data[mch_id]." ".$data[appid]." ".$data[ill_type]." ".$data[ once_str]." "; $url = https://api.mch./mmpaymkttransfers/gethbinfo; $result = $this->https_post($url,$dataXML,true); $ret = $this->xmlToArray($result); if($ret[ eturn_code]==SUCCESS && $ret[ esult_code] == SUCCESS) { return $ret; } else { $this->errorLog(查询红包记录失败,$ret); return $ret[err_code_des]; } } /** 获取用户微信的OPENID* */ public function openid($c=false) { if($_GET[state]!="zgm"){ $t = $c ? "snsapi_userinfo" : "snsapi_base"; $url=urlencode(get_url()); $url="https://open./connect/oauth2/authorize?appid=".$this->appid."&redirect_uri=".$url."&response_type=code&scope=".$t."&state=zgm#wechat_redirect"; echo "window.location.href=$url;"; exit; } if($_GET[code]){ $url="https://api./sns/oauth2/access_token?appid=".$this->appid."&secret=".$this->secret."&code=".$_GET[code]."&grant_type=authorization_code"; $wx_db=json_decode($this->https_get($url)); if($c){$url_2="https://api./sns/userinfo?access_token=".$wx_db->access_token."&openid=".$wx_db->openid."&lang=zh_CN";$db=json_decode($this->https_get($url_2));return $db; }else{return $wx_db->openid; } } } /* * 发起网络GET请求 * @params string $url : URL链接 */ private function https_get($url) { $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($curl, CURLOPT_HEADER, FALSE) ; curl_setopt($curl, CURLOPT_TIMEOUT,60); if (curl_errno($curl)) { return Errno.curl_error($curl); } else{$result=curl_exec($curl);} curl_close($curl); return $result; } //对参数排序,生成MD5加密签名 private function getParam($paramArray, $isencode=false) { $paramStr = \; ksort($paramArray); $i = 0; foreach ($paramArray as $key => $value) { if ($key == Signature){continue; } if ($i == 0){$paramStr .= \; }else{$paramStr .= &; } $paramStr .= $key . = . ($isencode?urlencode($value):$value); ++$i; } $stringSignTemp=$paramStr."&key=".$this->key; $sign=strtoupper(md5($stringSignTemp)); return $sign; } //POST提交数据 private function https_post($url,$data,$ssl = false) { $ch = curl_init (); curl_setopt ( $ch, CURLOPT_URL, $url ); curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, "POST" ); curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE ); curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, FALSE ); if($ssl) { curl_setopt ( $ch,CURLOPT_SSLCERT,$this->sslcert_path); curl_setopt ( $ch,CURLOPT_SSLKEY,$this->sslkey_path); } curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 ); curl_setopt ( $ch, CURLOPT_AUTOREFERER, 1 ); curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data ); curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true ); $result = curl_exec($ch); if (curl_errno($ch)) { return Errno: .curl_error($ch); } curl_close($ch); return $result; } /* * XML转array * @params xml $xml : xml 数据 * return array $data : 转义后的array数组 */ private function xmlToArray($xml) { libxml_disable_entity_loader(true); $xmlstring = simplexml_load_string($xml, SimpleXMLElement, LIBXML_NOCDATA); $val = json_decode(json_encode($xmlstring),true); return $val; } /* * 记录日志 * @params string $msg : 提示语句 * @params array $ret : 错误结果 */ private function errorLog($msg,$ret) { file_put_contents(ROOT_PATH . untime/error/wxpay.log, "[" . date(Y-m-d H:i:s) . "] ".$msg."," .json_encode($ret).PHP_EOL, FILE_APPEND); }}

B、Controller层,Test.php

杀毒软件 源码,ubuntu如何连接蓝牙,tomcat稳定性测试,爬虫最基础,azure搭建php环境,江苏一站式seo优化哪家便宜lzw

openid(); $pay = $wxpay->payForWeixin($openid,date(YmdHis).rand(1,5),.1); $paySign =strtoupper(MD5(appId=.$pay[appId].&nonceStr=.$pay[ onceStr].&package=.$pay[package].&signType=MD5&timeStamp=.$pay[ imeStamp].&key=536*****9e8)); $h5 = array( appId=> $pay[appId], imeStamp => $pay[ imeStamp], onceStr => $pay[ onceStr], package => $pay[package], signType => $pay[signType], paySign => $paySign ); $this->assign(wxpay,$h5); return view(); }}

C、HTML中调用微信支付,wx.html

订单示例function onBridgeReady(){ WeixinJSBridge.invoke( getBrandWCPayRequest, {"appId":"{$wxpay[appId]}","timeStamp":"{$wxpay[ imeStamp]}","nonceStr":"{$wxpay[ onceStr]}","package":"{$wxpay[package]}","signType":"MD5","paySign":"{$wxpay[paySign]}" }, function(res){if(res.err_msg == "get_brand_wcpay_request:ok" ){ // 使用以上方式判断前端返回,微信团队郑重提示: //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。} }); } if (typeof WeixinJSBridge == "undefined"){ if( document.addEventListener ){ document.addEventListener(WeixinJSBridgeReady, onBridgeReady, false); }else if (document.attachEvent){ document.attachEvent(WeixinJSBridgeReady, onBridgeReady); document.attachEvent(onWeixinJSBridgeReady, onBridgeReady); } }else{ onBridgeReady(); }

D、接收微信支付返回结果,支付时设置的notify_url值,确保此链接外网能访问。wxpaynofiy.php

checkSign($data)) {$transaction_id = $data[ ransaction_id];//微信支付订单号$out_trade_no = $data[out_trade_no]; //商家订单号$this->errorLog(微信支付返回结果,微信支付订单号:.$transaction_id.,商家订单号:.$out_trade_no,[]); } else {$this->errorLog(微信支付返回结果签名验证失败,$data); } } else { $this->errorLog(微信支付返回结果,$data); } echo <![CDATA[SUCCESS]]><![CDATA[OK]]>; } /** 验证签名* @params array $result : 微信支付成功返回的结果数组* return bool $ret : 成功true,失败false* */ private function checkSign(array $data) { $str = \; ksort($data); foreach ($data as $k => $v) { if($k != sign) $str .= $k.=.$v.&; } $temp = $str . key=5363******49e8;//key:商户支付密钥 $sign = strtoupper(md5($temp)); return $sign == $data[sign] ? true : false; } private function errorLog($msg,$ret) { file_put_contents(ROOT_PATH . untime/error/wxpaynofiy.log, "[" . date(Y-m-d H:i:s) . "] ".$msg."," .json_encode($ret).PHP_EOL, FILE_APPEND); }}

相关推荐:

微信支付与支付宝支付整合 PHP实现

PHP如何实现微信支付

视频教学 :php微信接口开发实战项目聊天机器人+微信支付

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。