微信支付开发.基础库..以风格调用

2024-04-05
来源:网络整理

下面对微信支付的各个方式进行说明:

wx。

基础库2.22.1开始支持,低版本需要兼容。 按风格调用:不支持 小程序插件:支持,小程序基础库版本要求不低于2.22.1才能在插件中发起支付。

wx。

按风格调用: 支持小程序插件: 不支持微信版本: 支持微信 Mac 版本: 支持发起微信支付。 拨打之前,您需要在小程序微信公众平台-功能-微信支付入口申请接入微信支付。 更多信息可以参考微信支付开发文档:

开发指南 订单接口 支付接口 老版本(v2) 开发指南 支付接口

wx。

基础库2.16.0开始支持,低版本需要兼容。调用方式:

小程序插件:不支持

创建定制的交易组件订单并发起付款。 只需使用连接定制版交易组件的小程序即可。 普通小程序可以使用wx. 直接地。

这里我们使用第二个,wx。 方法,看看这个方法的具体使用需要哪些参数:

wx.requestPayment({ nonceStr: 'nonceStr', package: 'package', paySign: 'paySign', signType: '', timeStamp: 'timeStamp', })

复制

完整启动小程序支付需要5个参数。 看看官方的说明:

中国官员给出:

本教程使用MD5

wx.requestPayment({ timeStamp: '', nonceStr: '', package: '', signType: 'MD5', paySign: '', success (res) { }, fail (res) { } })

复制

接下来我们需要完成统一下单操作,将小程序绑定微信商户,获取商户号,在微信支付页面找到:

我的账户->API审核->V2密钥->生成随机32位密钥并输入(自己备份,不需要使用任何工具,只需随机输入并包含大写字母即可!)

接下来获取商户号()和V2密钥(key)

那! ! 如何获取wx.中的各个参数?

别担心,我已经给你踩坑了,我一定会解释清楚的!

首先我们先把整个过程解释清楚。 我们将通过统一下单获取商户号、v2密钥、小程序等参数。

微信小程序开发微信支付_php 微信小程序支付_微信小程序微信支付实现

详情请参见统一订单文件,其中已注明:

会返回预付费交易会话ID,那么这是做什么用的呢?

它用于获取签名

至此我们已经获得了商户编号、密钥和签名。 现在让我们开始这个详细的教程吧!

2.详细教程 1.后端.php代码

pay(); echo json_encode($return);

复制

2..php打包代码

记得修改里面的回调通知

appid = $appid; $this->openid = $openid; $this->mch_id = $mch_id; $this->key = $key; $this->out_trade_no = $out_trade_no; $this->body = $body; $this->attach = $attach; $this->total_fee = $total_fee; } public function pay() { //统一下单接口 $return = $this->weixinapp(); return $return; } //统一下单接口 private function unifiedorder() { $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; $parameters = array( 'appid' => $this->appid, //小程序ID 'mch_id' => $this->mch_id, //商户号 'nonce_str' => $this->createNoncestr(), //随机字符串 // 'body' => 'test', //商品描述 'body' => $this->body, 'attach' =>$this->attach, // 'out_trade_no' => '2015450806125348', //商户订单号 'out_trade_no'=> $this->out_trade_no, // 'total_fee' => floatval(0.01 * 100), //总金额 单位 分 'total_fee' => $this->total_fee, // 'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], //终端IP 'spbill_create_ip' => '192.168.0.161', //终端IP 'notify_url' => '回调地址', //通知地址 确保外网能正常访问 'openid' => $this->openid, //用户id 'trade_type' => 'JSAPI'//交易类型 ); //统一下单签名 $parameters['sign'] = $this->getSign($parameters); $xmlData = $this->arrayToXml($parameters); $return = $this->xmlToArray($this->postXmlCurl($xmlData, $url, 60)); return $return; } private static function postXmlCurl($xml, $url, $second = 30) { $ch = curl_init(); //设置超时 curl_setopt($ch, CURLOPT_TIMEOUT, $second); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //严格校验 //设置header curl_setopt($ch, CURLOPT_HEADER, FALSE); //要求结果为字符串且输出到屏幕上 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //post提交方式 curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); curl_setopt($ch, CURLOPT_TIMEOUT, 40); set_time_limit(0); //运行curl $data = curl_exec($ch); //返回结果 if ($data) { curl_close($ch); return $data; } else { $error = curl_errno($ch); curl_close($ch); throw new WxPayException("curl出错,错误码:$error"); } } //数组转换成xml private function arrayToXml($arr) { $xml = ""; foreach ($arr as $key => $val) { if (is_array($val)) { $xml .= "<" . $key . ">" . arrayToXml($val) . ""; } else { $xml .= "<" . $key . ">" . $val . ""; } } $xml .= ""; return $xml; } //xml转换成数组 private function xmlToArray($xml) { //禁止引用外部xml实体 libxml_disable_entity_loader(true); $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); $val = json_decode(json_encode($xmlstring), true); return $val; } //微信小程序接口 private function weixinapp() { //统一下单接口 $unifiedorder = $this->unifiedorder(); // print_r($unifiedorder); $parameters = array( 'appId' => $this->appid, //小程序ID 'timeStamp' => '' . time() . '', //时间戳 'nonceStr' => $this->createNoncestr(), //随机串 'package' => 'prepay_id=' . $unifiedorder['prepay_id'], //数据包 'signType' => 'MD5'//签名方式 ); //签名 $parameters['paySign'] = $this->getSign($parameters); return $parameters; } //作用:产生随机字符串,不长于32位 private function createNoncestr($length = 32) { $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } //作用:生成签名 private function getSign($Obj) { foreach ($Obj as $k => $v) { $Parameters[$k] = $v; } //签名步骤一:按字典序排序参数 ksort($Parameters); $String = $this->formatBizQueryParaMap($Parameters, false); //签名步骤二:在string后加入KEY $String = $String . "&key=" . $this->key; //签名步骤三:MD5加密 $String = md5($String); //签名步骤四:所有字符转为大写 $result_ = strtoupper($String); return $result_; } ///作用:格式化参数,签名过程需要使用 private function formatBizQueryParaMap($paraMap, $urlencode) { $buff = ""; ksort($paraMap); foreach ($paraMap as $k => $v) { if ($urlencode) { $v = urlencode($v); } $buff .= $k . "=" . $v . "&"; } $reqPar; if (strlen($buff) > 0) { $reqPar = substr($buff, 0, strlen($buff) - 1); } return $reqPar; } }

复制

3.后台支付成功后收到微信发送的通知。

自己改一下,和自己的业务联系起来就可以了。 至于最下面那个

回声'';

以上是处理通知的。 简单来说,微信告诉你对方的支付结果。 你必须告诉对方我已经正确处理了此事,否则微信会按照一定期限通知你。 随着时间的推移,通知的频率会越来越少,直到没有通知。 建议你做一些处理,避免覆盖业务。 我们只需对微信返回的参数进行业务处理即可。 这里不用多说,自己看代码即可。

query($sq); mysqli_free_result($r);//释放 //查询订单数据进行推送 $cx_tuis_data="select * from order_pay WHERE openid='$open_id' and md_order='$attach'"; $jieguo_data=$conn->query($cx_tuis_data); $new_data=$jieguo_data->fetch_assoc(); $nnew_shopname=$new_data['shop_name']; $nnew_shopmoney=$new_data['money']; $nnew_shoptime=$new_data['time']; mysqli_free_result($jieguo_data);//释放 //消息推送 include 'payment_success_notify.php'; // $page="pages/myqj/myqj";//点击小程序订阅消息跳转的页 moban($touser,$ACCESS_TOKEN,"7IG9zV_nPkwrJTiTDI7fUkVOSwgl8h60axbdXoE6h0Q",$out_trade_no,$nnew_shopname,$nnew_shopmoney,$nnew_shoptime); //调用方法 格式(openid,ACCESS_TOKEN,模板id,数据1,数据2,数据3,数据4,数据5); echo '';

复制

4.小程序前端wxml

支付

5.小程序主要js

pay:function(){ wx.request({ url: '你的域名/payfee.php', //仅为示例,并非真实的接口地址 data: { money: '12.00',//模拟的支付金额 openid: 'o7J2i5YNkHn0nELz87HFS6zKL9oQ',//发起人openid attach:'12'//自定义参数 }, header: { 'content-type': 'application/json' // 默认值 }, success (res) { console.log(res.data) wx.requestPayment({ 'timeStamp': res.data.timeStamp, 'nonceStr': res.data.nonceStr, 'package': res.data.package, 'signType': 'MD5', 'paySign': res.data.paySign, 'success':function(res){ //支付成功 }, 'fail':function(res){ //支付失败 } }) } }) },

复制

好了,到这里,基本上就完成了!

分享