主要三个页面,一个微信小程序页面,一个请求接口文件,一个回调页面

过程:小程序请求后端接口文件,付款成功后触发回调页面

微信小程序页面

    zhifu() {this.pay();},pay(total_fee) {var total_fee = total_fee;wx.login({success: res => {//code 用于获取openID的条件之一var code = res.code;wx.request({url: 后台接口文件,method: "POST",data: {total_fee: total_fee,code: code,},header: {'content-type': 'application/x-www-form-urlencoded' // 默认值},success: function (res) { //后端返回的数据var data = res.data;console.log(data);console.log(data["timeStamp"]);wx.requestPayment({timeStamp: data['timeStamp'],nonceStr: data['nonceStr'],package: data['package'],signType: data['signType'],paySign: data['paySign'],success: function (res) {wx.showModal({title: '支付成功',content: '',})},fail: function (res) {console.log(res);}})}});}})},

后端 接口文件

<?php$aaa = new PayController;
$aaa->pay($_POST['code']);class PayController
{public function __construct(){// 支付// $this->appid =  'w 8c3a'; //微信支付申请对应的公众号的APPID// $this->appKey = '5895b ef6e327489f'; //微信支付申请对应的公众号的APP Key,绑定公众号做的小程序,所以虽然商户号这些是属于公众号的,但是这里必须使用小程序加公众号的信息// 操作方法 添加特约商户号关联起来,在商户号后台关联小程序即可,调用时候使用小程序的appid,即 需要使用的 小程序appid+小程序AppSecret + 公众号mchid + 公众号apiKey$this->mchid = '148 022'; //https://pay.weixin.qq.com 产品中心-开发配置-商户号$this->apiKey = 'lnh rvjw';   //https://pay.weixin.qq.com 帐户设置-安全设置-API安全-API密钥-设置API密钥$this->xiaoAppid = "wxa4 e31";   /* 小程序appid */$this->xiaoAppSecret  = "d5 55c";/* 小程序AppSecret */// //回调的url【自己填写】$this->notify_url = '回调/notify.php';}//微信支付public function pay($code){//获取openidif ($code) {   //用code获取openid$code = $code;$WX_APPID =  $this->xiaoAppid; //appid$WX_SECRET =   $this->xiaoAppSecret; //AppSecret$url = "https://api.weixin.qq.com/sns/jscode2session?appid=" . $WX_APPID . "&secret=" . $WX_SECRET . "&js_code=" . $code . "&grant_type=authorization_code";$infos = json_decode(file_get_contents($url));$openid = $infos->openid;}$fee = 0.01; //举例支付0.01$appid =        $this->xiaoAppid; //这里填写公众号appiid的话会显示 appid和openid不匹配 ,解决方法 添加特约商户号关联起来,在商户号后台关联小程序即可,调用时候使用小程序的appid$body =         '标题';$mch_id =       $this->mchid;  //商户号$nonce_str =    $this->nonce_str(); //随机字符串$notify_url =    $this->notify_url;$openid =       $openid;$out_trade_no = $this->order_number($openid); //商户订单号$spbill_create_ip = '127.0.0.1'; //服务器的ip【自己填写】;$total_fee =    $fee * 100; // 微信支付单位是分,所以这里需要*100$trade_type = 'JSAPI'; //交易类型 默认//这里是按照顺序的 因为下面的签名是按照顺序 排序错误 肯定出错$post['appid'] = $appid;$post['body'] = $body;$post['mch_id'] = $mch_id;$post['nonce_str'] = $nonce_str; //随机字符串$post['notify_url'] = $notify_url;$post['openid'] = $openid;$post['out_trade_no'] = $out_trade_no;$post['spbill_create_ip'] = $spbill_create_ip; //终端的ip$post['total_fee'] = $total_fee; //总金额 $post['trade_type'] = $trade_type;// $sign1 = $this->sign($post); //签名$sign = self::getSign($post,  $this->apiKey);$post_xml = '<xml><appid>' . $appid . '</appid><body>' . $body . '</body><mch_id>' . $mch_id . '</mch_id><nonce_str>' . $nonce_str . '</nonce_str><notify_url>' . $notify_url . '</notify_url><openid>' . $openid . '</openid><out_trade_no>' . $out_trade_no . '</out_trade_no><spbill_create_ip>' . $spbill_create_ip . '</spbill_create_ip><total_fee>' . $total_fee . '</total_fee><trade_type>' . $trade_type . '</trade_type><sign>' . $sign . '</sign></xml> ';//统一接口prepay_id$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';$xml = $this->http_request($url, $post_xml);  //发送请求$array = $this->xml($xml); //全要大写// print_r($array); // print_r($xml); die();/*  */if ($array['RETURN_CODE'] == 'SUCCESS' && $array['RESULT_CODE'] == 'SUCCESS') {$time = time();$tmp = []; //临时数组用于签名$tmp['appId'] = $appid;$tmp['nonceStr'] = $nonce_str;$tmp['package'] = 'prepay_id=' . $array['PREPAY_ID'];$tmp['signType'] = 'MD5';$tmp['timeStamp'] = "$time";$data['state'] = 200;$data['timeStamp'] = "$time"; //时间戳$data['nonceStr'] = $nonce_str; //随机字符串$data['signType'] = 'MD5'; //签名算法,暂支持 MD5$data['package'] = 'prepay_id=' . $array['PREPAY_ID']; //统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=*$data['paySign'] =  self::getSign($tmp,  $this->apiKey); //签名,具体签名方案参见微信公众号支付帮助文档;$data['out_trade_no'] = $out_trade_no;} else {$data['state'] = 0;$data['text'] = "错误";$data['RETURN_CODE'] = $array['RETURN_CODE'];$data['RETURN_MSG'] = $array['RETURN_MSG'];}echo json_encode($data);}//随机32位字符串private function nonce_str(){$result = '';$str = 'QWERTYUIOPASDFGHJKLZXVBNMqwertyuioplkjhgfdsamnbvcxz';for ($i = 0; $i < 32; $i++) {$result .= $str[rand(0, 48)];}return $result;}//生成订单号private function order_number($openid){//date('Ymd',time()).time().rand(10,99);//18位return md5($openid . time() . rand(10, 99)); //32位}//签名 $data要先排好顺序private function sign($data){$stringA = '';foreach ($data as $key => $value) {if (!$value) continue;if ($stringA) $stringA .= '&' . $key . "=" . $value;else $stringA = $key . "=" . $value;}$wx_key = ''; //申请支付后有给予一个商户账号和密码,登陆后自己设置的key$stringSignTemp = $stringA . '&key=' . $wx_key;return strtoupper(md5($stringSignTemp));}// 获取签名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;}//curl请求public function http_request($url, $data = null, $headers = array()){$curl = curl_init();if (count($headers) >= 1) {curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);}curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);if (!empty($data)) {curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, $data);}curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);$output = curl_exec($curl);curl_close($curl);return $output;}//获取xmlprivate function xml($xml){$p = xml_parser_create();xml_parse_into_struct($p, $xml, $vals, $index);xml_parser_free($p);$data = [];foreach ($index as $key => $value) {if ($key == 'xml' || $key == 'XML') continue;$tag = $vals[$value[0]]['tag'];$value = $vals[$value[0]]['value'];$data[$tag] = $value;}return $data;}
}

后台回调页面,在付款成功后就会触发这个页面,我在里面写了一个函数,付款成功后就会把付款信息生成日志文件

<?php$info = file_get_contents("php://input");
// $order = xmlToArray($info);
// $trade['order'] = $order['out_trade_no'];   /* 微信分配的小程序ID,即订单号 */
// $trade["total_fee"] = $order["total_fee"];    /* 金额 */
// $trade["sign"] = $order["sign"];    /* 签名 */
// https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7&index=8// // 3,针对信息做处理,
// // 3.1根据返回的信息在生成签名防止数据泄漏导致出现“假通知”,造成资金损失。
// $newSign = verifySign($order);
// // // 3.2根据订单id去数据库或者换成查找订单消息
// $data = $pdo->query("SELECT payAmount,status from a_buy WHERE outTradeNo='{$trade['order']}'")->fetch(PDO::FETCH_ASSOC); //需要注意单位为分// if (($data['payAmount'] * 100) == $trade['total_fee'] && $newSign == $trade["sign"]) {//     if ($data['status'] == '待付款') {//         // 更改订单状态
//         $pdo->exec("UPDATE a_buy set status='待发货'  WHERE outTradeNo='{$trade['order']}'");var_dump($info);logInfo($info); //写入日志
//     }
//     return
//         '<xml>
//             <return_code><![CDATA[SUCCESS]]></return_code>
//             <return_msg><![CDATA[OK]]></return_msg>
//         </xml>';
//     var_dump($data);
// } else {//     // 失败的请求
// }// 将xml装换为数组
function xmlToArray($data)
{return  (array)simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA);
}
// 将付款成功后的数据写入log 日志文件
function logInfo($info, $fileName = 'pay')
{$debugInfo = debug_backtrace();$message = date("Y-m-d H-i-s") . PHP_EOL . $info . PHP_EOL;;$message .= '[' . $debugInfo[0]['file'] . ']' . 'line' . $debugInfo[0]["line"] . PHP_EOL;file_put_contents($fileName . '-' . date("Y-m-d") . '.log', $message, FILE_APPEND);
}
// 判断返回的签名和根据数据生成的数据判断是否相同,防止数据泄漏导致出现“假通知”,造成资金损失。
function verifySign($params, $apikey = "c17FZND q71Tt9")
{ksort($params);$string = "";foreach ($params as $k => $v) {if ($k != "sign" && $v != "" && !is_array($v)) {$string .= $k . "=" . $v . "&";}}$string = $string . "key=" . $apikey;$string = md5($string);$result = strtoupper($string);return $result;
}

微信小程序支付封装-复制即用相关推荐

  1. Java微信小程序支付篇

    在做完一个仿美团的应用,我将其中涉及到的一些技术点进行总结和整理,当下次遇到类似的问题就能省下不少时间,避免踩坑. 一.微信小程序支付的使用 微信支付有官方提供的SDK,但要自己处理的东西比较多.我使 ...

  2. 微信小程序支付最容易犯的坑notify_url(支付回调)

    最近做了微信小程序支付,支付成功之后发现notify_url回调地址竟然没有访问. 检查了无数次代码,下单结果里面的回调地址看了又看,都没有错啊. 把回调地址复制出来到浏览器上面,外网也是可以访问的啊 ...

  3. 加入域时出现以下错误 登陆失败 该目标账户名称不正确_微信支付踩坑合集:微信小程序支付失败是什么原因?持续更新...

    微信小程序开发的过程一定会遇到各种问题,最让人棘手的就是支付问题,因为没有支付做商城类似的小程序就没有办法完成最关键的一步.那么支付失败到底什么原因呢?一下子收集了几个错误类似,希望对你有帮助: No ...

  4. 微信小程序支付(1)Uni-app平台API接口

    uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS.Android.Web(响应式).以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉/淘宝).快 ...

  5. 微信小程序支付 php后台

    微信小程序支付,一贯的风格,代码复制粘贴就好使,想明白原理,自己看开发文档去 一.前端代码: 1.先写一个可以点击支付的按钮 <view class="chongzhi_button& ...

  6. 微擎支付返回商户单号_微信小程序支付流程

    微信支付之小程序支付 微信的支付方式有以下几种,不同的支付方式适用于不同的支付场景,而今天要给大家讲的就是 小程序支付 方式 说到支付功能就要涉及到金钱交易,必定是有比较严格的规范及流程,如要求小程序 ...

  7. 微信小程序支付-java对接微信

    一共是两个方法: 一个方法后台生成预支付订单,得到预支付交易会话标识prepay_id,传给前端,让前端调起小程序支付: 一个是支付回调 目录 一.生成预支付订单 注意: 二. 支付回调 一.生成预支 ...

  8. 微信小程序支付java服务端集成采坑总结

    先上个微信小程序支付官方文档地址: https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7&index=8 重点看 ...

  9. SpringBoot对接微信小程序支付功能开发(一,下单功能)

    1,接入前准备: 接入模式选择直连模式: 申请小程序,得到APPID,并开通微信支付: 申请微信商户号,得到mchid,并绑定APPID: 配置商户API key,下载并配置商户证书,根据微信官方文档 ...

  10. SpringBoot 搭建微信小程序支付(JSAPI) 纯后端

    一.支付流程 PS:做这个之前  ,先去下载官方的SDK吧  https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 1.首先要拿到 ...

最新文章

  1. CSS实现强制换行-------Day 78
  2. PHP 实现一个可用的redis 事务锁, 解决并发问题
  3. 小型的网站服务器配置,中小型网站服务器配置参考
  4. VTK:PolyData之RotationAroundLine
  5. 十种经济的方法帮你建立企业品牌
  6. Java学习——使用Static修饰符
  7. 身份验证错误错误指定的句柄无效_基于 Web 端的人脸识别身份验证「实践」
  8. vue基础之data
  9. zw版【转发·台湾nvp系列Delphi例程】HALCON HistoToThresh1
  10. cydia下载地址_Cydia下载完整安装包_cydia软件源官方下载-PChome下载中心
  11. 整理:周鸿祎谈如何写商业计划书
  12. 智能手机低价“裸奔”( 山寨手机芯片“海思K3”VS“MTK”)
  13. java 码表_java IO之 编码 (码表 编码 解码 转换流)
  14. PINN解偏微分方程--程函方程
  15. Kafka bootstrap.servers
  16. 聊聊被注销的TMQ公众号
  17. 详解量子计算:相位反冲与相位反转
  18. matlab心碎的心,让人撕心裂肺的心痛网名,心碎绝望的伤感昵称
  19. 2016-2017-1 《信息安全系统设计基础》课程总结
  20. linux设置时间大全

热门文章

  1. 现代软件工程 第一章 【概论】第6题——原旭莹
  2. 程序化导入导出EXCEL数据,完全由模板输出
  3. inventor整理资源中心收藏夹
  4. 孙鑫VC学习笔记:第十五讲 (一) 进程和线程基本概念
  5. fastjson jsonobject 转bean失败_挂面这么做,零失败,口感还是一顶一的棒
  6. 计算n位二进制的所有情况
  7. pytroch中的Variable()介绍
  8. openwrt监控linux,openwrt linux portal 实现 支持 https 支持基于时长和流量控制
  9. Java从入门到精通 第0章Java学习指南
  10. MatConvnet工具箱文档翻译理解四