微信小程序接入支付功能并实现支付

2023-11-20

随着微信小程序越来越广泛的应用,现在小程序几乎无所不能(绝对啦,哈哈),那么就会有很多微信小程序需要有支付的需求,那么该文章将带领大家走一遍如何实现微信小程序的支付功能.

第一步,微信小程序管理后台 -> 微信支付->接入微信支付 及关联(设置)商户信息

 如果是第一次接入, 直接申请接入,然后选择弹出窗口的"我还没有商户号"选项接入即可

 接入商户,过程比较简单,随着指引一步一步走即可. 做完引导后所需的工作后,你需要确认做下面的两步,因为在后面的code时需要:

      1.设置支付授权目录:  依次找到  商户平台->产品中心->开发配置,然后点击下面的添加进行添加支付目录

     个人感觉类似微信小程序开发添加的request合法域名, 上面添加的这个目录,应该和你在后期在程序后台写的最终方法调用名一致,假设这里你设置的是  https://abc.cn/mypay/payOP

    2. 设置API密钥:  依次找到  商户平台->账号中心->API安全->设置APIv2密钥 设置后,可以把密钥拷贝出来记住,下面的code部分也需要该信息

第二步:开发小程序的支付页面,此处只简单介绍页面,重点介绍js部分

     1.配置页面信息, 假设页面只有一个输入金额的输入框,加一个按钮,那么在点击按钮后,执行js的操作部分如:

formSubmit:function(e){
    let pp = e.detail.value;
  
    if(pp.money.trim()=="")
    {
      wx.showToast({
        title: "请输入捐赠金额!", //显示文本
        icon: 'none', //使用图标
        duration: 1000  //显示时间
      })
      return false;
    }

    // 注意,下面的reqest代码部分,that.data.userInfo.wid存储的就是当前用户的openid,这个信息一般会在用户登录后进行了存储,如果你没有存储,可以通过wx.login去获取,此处不再赘述

    let that = this; 
    wx. request({
      url:'刚刚在上面设置的安全支付目录地址/'+that.data.userInfo.wid+'/'+pp.money,
      header: {
        'content-type': 'application/json' // 默认值
      }, 
      success: function (ress){ 
        // success
        let res = ress.data;  
        if (res.status){
          let out_trade_no = res.out_trade_no;//记录商户订单号 ,为后续缴费成功回调做记录
          wx.requestOrderPayment ({ 
            'timeStamp': res.timeStamp,
            'nonceStr': res.nonceStr,
            'package': res.package, 
            'signType': 'MD5',
            'paySign': res.paySign,  
            'success': function(res3){ 
              wx.showToast({
                title: "支付成功,感谢您的善心!", 
                icon: 'success', //使用图标
                duration: 1000  //显示时间
              })
              //此处负责回调,把先前的订单状态值为已付款
            },
            'fail':function (res2){
              console.log (res2);
            }
          })  
        }  
      },
      fail: function () {
        //后台没连上
      } ,
      complete: function () {
      // 处理结束
      } 
    })
  },

第三步: 服务器后台代码部分,这里以php为例进行讲解,其它语言可以适当翻译改动

//支付调用的主函数, 名称需要和设置的商户支付授权目录一致
public function payOP(){
		 
		//获取opid和fee
		$wid= $this->uri->segment(3,0);	//获取小程序传过来的openid
	    $fee = $this->uri->segment(4,0);//获取小程序传过来的捐款
	 
	    //设置参数
	    $appid =        'xxxxx';//小程序的appid ,如果是公众号 就是公众号的appid
	    $body =         '本次支付的介绍,文字信息随便写';
	    $mch_id =       '商户平台登录账号';
	    $nonce_str =    $this->nonce_str();//随机字符串,下面会提供函数
	    $notify_url =   '微信支付回调函数,说实话这个没啥用,不设应该不行,你就设置成你的reqest域名吧';
	    $openid =       $wid;//当前支付用户的openid
	    $out_trade_no = date('YmdHis_', time()).ceil(microtime()*1000);//商户订单号,需唯一
	    $spbill_create_ip = '114.114.114.114';//随便一个真实存在的ip,必须要设置
	    $total_fee =    $fee*100;//因为充值金额最小是1 而且单位为分 如果是充值1元所以这里需要*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;
	    $sign = $this->sign($post);//签名
   
	    $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);//全要大写
    
	    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['status'] = true;
	        $data['timeStamp'] = "$time";//时间戳
	        $data['nonceStr'] = $nonce_str;//随机字符串
	        $data['signType'] = 'MD5';//签名算法,暂支持 MD5
	        $data['package'] = 'prepay_id='.$array['PREPAY_ID'];//统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=*
	        $data['paySign'] = $this->sign($tmp);//签名,具体签名方案参见微信公众号支付帮助文档;
	        $data['out_trade_no'] = $out_trade_no;
	 		echo json_encode($data);
	    }else{
	        $data['status'] = false;
	        $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;
	}
	//签名 $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 = '***************';//这里就是我上面讲解的设置了API的那个密钥 !!!
	    $stringSignTemp = $stringA.'&key='.$wx_key;
	    return strtoupper(md5($stringSignTemp)); 
	}
	private 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;
	}
	private 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;
	}

上述代码是亲测有效并且能正常支付的,请需要的朋友拿去测试, 我是活雷锋,不谢 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信小程序接入支付功能并实现支付 的相关文章

  • JDBC(Java DataBase Connectivity)

    JDBC 目录 JDBC 简介 JDBC结构步骤 API接口 DriverManager Conection Statement ResultSet PreparedStatement 简介 JDBC是使用Java语言操作关系数据库的一套A
  • maven安装和环境变量配置

    myeclipse自带maven Maven4MyEclipse 创建项目 新建Web Projects项目 在新建的页面上打上maven的勾 新建的项目里会多出个pom xml文件 为项目添加依赖包 右键项目 选择Maven4MyEcli
  • 多对一查询

    是这样的 首先学生表中有三个属性 前两个属性要出现在结果集中 第三个属性哦用于查找教师的名字 然后呢 用resultMap重新处理 将老师的名字重新对应为学生表的第三个属性 其实这样做有局限 多对一查询 SQL语句 SELECT s id
  • python中文件的操作

    gt gt gt f open home ceshi mmm txt w w 为读写 gt gt gt f write zuoshouzhiyue n 写入数据 记得加 n gt gt gt f tell 当前在文件中的位置 14 gt g

随机推荐

  • QToolButton和QPushButton的区别

    用代码实践了一下QPushButton和QToolButton的差异 include widget h include
  • Mathematica函数大全

    一 运算符及特殊符号 Line1 执行Line 不显示结果 Line1 line2 顺次执行Line1 2 并显示结果 name 关于系统变量name 的信息 name 关于系统变量name 的全部信息 command 执行Dos 命令 n
  • 《权力的游戏》最终季上线!谁是你最喜爱的演员?这里有一份Python教程

    译者 刘畅 编辑 琥珀 出品 AI科技大本营 id rgznai100 权力的游戏 最终季已于近日开播 对于全世界翘首以待的粉丝们来说 其最大的魅力就在于 无法预知的人物命运 那些在魔幻时代的洪流中不断沉浮的人们 将会迎来怎样的结局 近日
  • DS18B20的原理及实例代码(51单片机、STM32单片机)

    一 DS18B20介绍 DS18B20数字温度传感器是DALLAS公司生产的单总线器件 用它来组成一个测温系统具有线路简单 体积小 在一根通信线上可以挂很多这样的数字温度传感器 十分方便 温度传感器种类众多 应用在高精度 高可靠性的场合时D
  • c语言程序for循环处设断点,C语言程序设计-循环.ppt

    C语言程序设计 循环 C语言程序设计 循环结构 while循环结构 例 求1 100之和 即 注意事项 如果循环体内只有一条语句 则可以不用大括号 语法上并没有要求一定要存在循环初始条件的设定 也没有要求循环条件中的变量必须在循环体内改变
  • 使用JTDS连接sqlserver数据库

    Java连接SQL Server 2000数据库时 有两种方法 1 通过Microsoft的JDBC驱动连接 此JDBC驱动共有三个文件 分别是mssqlserver jar msutil jar和msbase jar 但是Microsof
  • IDEA 查看Springboot单元测试代码覆盖率报错

    报错信息 D resource java jdk 1 8 261 bin java exe ea javaagent C Users 镜 AppData Local JetBrains IntelliJIdea2020 2 testAgen
  • 软路由自建iptv服务器,LEDE软路由 iPTV 实现任意端口看电视的方法

    摘 要 1 光猫直接连接电脑 超级管理员进入光猫后台修改光猫为桥接模式 把IPTV 的VLAN ID绑定到跟宽带一样的数据端口 如下图 2 软路由 我们以6网口的来演示 进入Lede后台 系统 进阶设置 配置dnsmasq添加代码 dhcp
  • 互联网寒冬?应届生还应该加入么?

    大家都在各种唱衰互联网行业 下面从真实的示例来分析一下 还能否加入这个行业 互联网企业现状 互联网企业地域分布 从业者从一线城市逐渐向低线扩展 对新一线及低线城市的青睐度上升 腾讯地域扩张 腾讯业务版图 阿里地域扩张 阿里业务版图 字节地域
  • PhpStorm为什么值得推荐?

    智能编码辅助 PhpStorm 是一个 PHP IDE 它实际上 获取 您的代码 它支持 PHP 5 3 5 4 5 5 5 6 7 0 7 1 7 2 提供动态错误预防 最佳自动完成和代码重构 零配置调试以及扩展的 HTML CSS 和J
  • sql ntext數據類型字符替換

    ntext數據類型字符替換 2011 08 21 塗聚文 create table tt sid INT IDENTITY 1 1 cont ntext go insert into tt cont values N fd sad fdsa
  • Qt 信号与槽

    Qt 信号与槽 在这章节里 我们学习 Qt 的信号与槽 这里分一个章节来学习这个 Qt 的信号与槽 可见 这个信号与槽有多么重要 在学习 Qt 的过程中 信号与槽是必不可少的部分 也是 Qt 编程的 基础 是 Qt 编程的一大创新 其实与
  • 文件通讯录

    copyright C 2014 2015 Lighting Studio Co Ltd File name Author Jerey Jobs Version 0 1 Date Description Funcion List inclu
  • 世界最强的黑客为何都在俄罗斯?他们到底有多逆天?

    世界上只有两种黑客 一种 是俄罗斯黑客 另一种 是 其他黑客 江湖传闻 俄罗斯黑客曾攻击美国政府网站 操纵美国大选 就连FBI都怕他们三分 今天带大家认见识见识战斗民族的另一面 黑客帝国 俄罗斯的黑客有多逆天 1994年成名战 美国最大的银
  • 用where in遇到null时的解决方法1

    参考 https www 2cto com database 201109 104960 html http ask csdn net questions 680006 1 SELECT FROM 华东 WHERE 公司代码 IN SELE
  • Matlab将mat格式文件多层数据逐级导出为excel

    我在处理牛津电池数据集时 因为我更喜欢用python来进行深度学习方面的操作 所以我需要将mat格式数据导出为excel表格 由于该数据分为多层 所以导出操作较为复杂 在网上查询许久后发现并没有相关的文章 后来便自己倒腾出来了 供需要的小伙
  • GPU 渲染管线与着色器 大白话总结 ---- 一篇就够

    转载自 https blog csdn net newchenxf article details 119803489 真的写的非常不错 大力推荐 GPU 渲染管线与着色器 大白话总结 一篇就够 文章目录 GPU 渲染管线与着色器 大白话总
  • uboot下UCLASS框架详解---结合项目工作中spi master和flash驱动开发

    文章目录 一 综述 二 UCLASS架构解析 2 1 uclass 2 2 udevice 2 3 uclass driver 2 4 driver 2 4 1 spi master driver 三 uboot代码解析 3 1 DM的初始
  • 北京理工大学计算机系郭伟,【记忆辉煌2014】品学兼优榜样——郭伟(2012级研究生)...

    青春宣言 自强不息 厚德载物 个人简介文章情况 1 Guo Wei et al Insect vision inspired particle filter for visual tracking Robotics and Biomimet
  • 微信小程序接入支付功能并实现支付

    随着微信小程序越来越广泛的应用 现在小程序几乎无所不能 绝对啦 哈哈 那么就会有很多微信小程序需要有支付的需求 那么该文章将带领大家走一遍如何实现微信小程序的支付功能 第一步 微信小程序管理后台 gt 微信支付 gt 接入微信支付 及关联