注意事项:

a、当时做的时候后端第一次返回是成功的,但是二次签名时前端发起支付总提示签名验证失败,也困扰了很久,后面细心一点慢慢检查总算发现了问题,二次签名方式类型必须一致,官方第一次签名不是md5 所以必须修改为md5 .修改方式是在extend/Wxpay/WxPay.Config.php 里面 getSignType函数 返回  MD5,问题二:第二次签名openId 与第一次签名是 openid 第二次openId 的区别是I大写。

b、去微信支付平台填写回调地址和支付授权目录 ,

支付授权目录:http://xxxx.com/index/api/orderpay 。指向后端当前支付方法

回调地址:http://xxxx.com/index/api/payNotify 指向后端支付回调处理方法。

一、PHP 后端代码

1、下载官网PHP支付示例代码 ,放到网站目录 extend/Wxpay 下面。

代码我下载下来有修改过配置文件 extend/Wxpay/WxPay.Config.php,所以放到百度网盘了

下载地址:链接:https://pan.baidu.com/s/1yn5py9Pko6cyVym228GcXA 
提取码:k4on

extend/Wxpay/WxPay.Config.php

<?php
/**
*
* example目录下为简单的支付样例,仅能用于搭建快速体验微信支付使用
* 样例的作用仅限于指导如何使用sdk,在安全上面仅做了简单处理, 复制使用样例代码时请慎重
* 请勿直接直接使用样例对外提供服务
*
**/
require_once "lib/WxPay.Config.Interface.php";/**
*
* 该类需要业务自己继承, 该类只是作为deamon使用
* 实际部署时,请务必保管自己的商户密钥,证书等
*
*/class WxPayConfig extends WxPayConfigInterface
{//=======【基本信息设置】=====================================/*** TODO: 修改这里配置为您自己申请的商户信息* 微信公众号信息配置* * APPID:绑定支付的APPID(必须配置,开户邮件中可查看)* * MCHID:商户号(必须配置,开户邮件中可查看)* */public $appid;   //APPIDpublic $appSecret;  //appsecret;public $merchantId;     //商户号  public $appkey; //keypublic $notifyUrl; //回调 地址public function __construct($appid='', $appSecret='', $merchantId = '', $appkey='', $notifyUrl = ''){$this->appid = $appid;$this->appSecret = $appSecret;$this->merchantId = $merchantId;$this->appkey = $appkey;         $this->notifyUrl = $notifyUrl;  }public function GetAppId(){return $this->appid;}public function GetMerchantId(){return $this->merchantId;}//=======【支付相关配置:支付成功回调地址/签名方式】===================================/*** TODO:支付回调url* 签名和验证签名方式, 支持md5和sha256方式**/public function GetNotifyUrl(){return $this->notifyUrl;}public function GetSignType(){return "MD5";}//=======【curl代理设置】===================================/*** TODO:这里设置代理机器,只有需要代理的时候才设置,不需要代理,请设置为0.0.0.0和0* 本例程通过curl使用HTTP POST方法,此处可修改代理服务器,* 默认CURL_PROXY_HOST=0.0.0.0和CURL_PROXY_PORT=0,此时不开启代理(如有需要才设置)* @var unknown_type*/public function GetProxy(&$proxyHost, &$proxyPort){$proxyHost = "0.0.0.0";$proxyPort = 0;}//=======【上报信息配置】===================================/*** TODO:接口调用上报等级,默认紧错误上报(注意:上报超时间为【1s】,上报无论成败【永不抛出异常】,* 不会影响接口调用流程),开启上报之后,方便微信监控请求调用的质量,建议至少* 开启错误上报。* 上报等级,0.关闭上报; 1.仅错误出错上报; 2.全量上报* @var int*/public function GetReportLevenl(){return 1;}//=======【商户密钥信息-需要业务方继承】===================================/** KEY:商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置), 请妥善保管, 避免密钥泄露* 设置地址:https://pay.weixin.qq.com/index.php/account/api_cert* * APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置), 请妥善保管, 避免密钥泄露* 获取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN* @var string*/public function GetKey(){return $this->appkey;}public function GetAppSecret(){return $this->appSecret;}//=======【证书路径设置-需要业务方继承】=====================================/*** TODO:设置商户证书路径* 证书路径,注意应该填写绝对路径(仅退款、撤销订单时需要,可登录商户平台下载,* API证书下载地址:https://pay.weixin.qq.com/index.php/account/api_cert,下载之前需要安装商户操作证书)* 注意:* 1.证书文件不能放在web服务器虚拟目录,应放在有访问权限控制的目录中,防止被他人下载;* 2.建议将证书文件名改为复杂且不容易猜测的文件名;* 3.商户服务器要做好病毒和木马防护工作,不被非法侵入者窃取证书文件。* @var path*/public function GetSSLCertPath(&$sslCertPath, &$sslKeyPath){$sslCertPath = './cert/apiclient_cert.pem';$sslKeyPath = './cert/apiclient_key.pem';}
}

你也可以自行去官网下载示例代码。https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

2、app/common.php

//输出
function result($code,$msg,$data){exit(json_encode(['code'=>$code,'msg'=>$msg,'data'=> $data]));
}//生成拼接URL
function ToUrlParams($data)
{$buff = "";foreach ($data as $k => $v){if($k != "sign" && $v != "" && !is_array($v)){$buff .= $k . "=" . $v . "&";}}$buff = trim($buff, "&");return $buff;
}/*** 生成签名*/
function MakeSign($data,$key)
{   //p($data);//签名步骤一:按字典序排序参数ksort($data);$string = ToUrlParams($data);   //签名步骤二:在string后加入KEY$string = $string . "&key=".$key;//echo $string;//签名步骤三:MD5$string = md5($string);  //签名步骤四:所有字符转为大写$result = strtoupper($string);return $result;
}

3、app/index/controll/api.php 在API里面编写处理逻辑

    //订单支付public function orderPay(){if ($_POST) {$this->weixinPay();}}//小程序支付生成二次签名public function paySign($params, $appid, $key){$data['appId']    = $appid;$data['nonceStr'] = $params['nonceStr'];$data['package']  = $params['package'];$data['signType'] = $params['signType'];$data['timeStamp']= $params['timeStamp'];return MakeSign($data, $key);}/*** 微信支付*/private function weixinPay(){//EXTEND_PATH 是在根目录index.php 定义的常量 define('EXTEND_PATH', __DIR__ .'/extend/');    import("Wxpay.lib.WxPay#Api", EXTEND_PATH); import('Wxpay.WxPay#Config', EXTEND_PATH);//支付配置 config 是我后台配置的取值$appid      = config('appid');   //APPID$appSecret  = config('appsecret');  //appsecret;$merchantId = config('merchantid');     //商户号$appkey     = config('appkey');     //支付key$notifyUrl  = config('paynotify'); //回调地址//支付参数$body     = input('body');$payMoney = input('price');$openId   = input('openid');$orderno  = input('orderno');$payMoney = $payMoney * 100;//统一下单$input = new \WxPayUnifiedOrder();$input->SetBody($body);//$input->SetAttach($body);$input->SetOut_trade_no($orderno);$input->SetTotal_fee($payMoney);$input->SetTime_start(date("YmdHis"));$input->SetTime_expire(date("YmdHis", time() + 600));//$input->SetGoods_tag("test");$input->SetNotify_url($notifyUrl);$input->SetTrade_type("JSAPI");$input->SetOpenid($openId);$config = new \WxPayConfig($appid, $appSecret, $merchantId, $appkey, $notifyUrl);$unifiedOrder = \WxPayApi::unifiedOrder($config, $input);//p($unifiedOrder);if ($unifiedOrder['result_code'] == 'SUCCESS' && $unifiedOrder['return_code'] == 'SUCCESS') {$time = time();$data['timeStamp'] = "$time"; //时间戳$data['nonceStr'] = $unifiedOrder['nonce_str']; //随机字符串$data['signType'] = 'MD5'; //签名算法,暂支持 MD5$data['package'] = 'prepay_id=' . $unifiedOrder['prepay_id'];  //统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=*$data['paySign'] = $this->paySign($data, $appid, $appkey);  //签名result(RE_SUCCESS, "发起支付成功", $data);} else {result(RE_ERROR, "发起支付失败", $data);}}/*** 支付回调*/public function payNotify(){$testxml  = file_get_contents("php://input");$jsonxml = json_encode(simplexml_load_string($testxml, 'SimpleXMLElement', LIBXML_NOCDATA));$result = json_decode($jsonxml, true);//转成数组,if ($result) {//如果成功返回了$w['orderno'] = $result['out_trade_no'];$d['paystate'] = 1;$d['paytime'] = date('Y-m-d H:i:s', time());if ($result['return_code']=="SUCCESS" && $result['result_code']=="SUCCESS") {db('order')->where($w)->update($d);  //更新订单数据为已支付}}}

二、小程序前端实现

<style lang="scss" scoped>
.tit { padding: 30rpx; color: #666; text-align: center; font-size: 32rpx; label {
color:red;
}
text { color: red; font-size: 50rpx; margin-right: 5rpx; }
}
.line { height: 10rpx; background: #f2f2f2; }
.item { display: flex; border-bottom: 1px solid #f1f1f1; align-items: center; justify-content: space-between; padding: 25rpx 30rpx; .fl {
color:#999;
}
.fr { color: #333; text-align: right; flex: 1; &.red {
color:red;
font-size:33rpx;
}
}
}
.pd20 { padding: 40rpx 20rpx; }
</style>
<template>
<view>
<view class="tit">
<view>
支付金额:
<label>¥</label>
<text>{{price}}</text>
元
</view>
</view>
<view class="line"></view>
<view class="item"><view class="fl">订单号</view><view class="fr">{{orderno}}</view>
</view>
<view class="item"><view class="fl">支付方式</view><view class="fr">微信</view>
</view>
<view class="pd20"><button class="btn" @tap="orderPay">立即支付</button>
</view>
</view>
</view>
</template>
<script>import pay from '@/utils/pay.js'export default {data() {return {orderno:'', //订单编号price:'', //订单价格title:'', //标题}},async onLoad(e) {this.orderno = e.orderno;this.title = e.title;this.price = e.price;},methods: {//订单支付async orderPay(){                        const json = await this.api.orderPay({q:{body:this.title,price:this.price,orderno:this.orderno,openid:this.app.globalData.openid}});if(json.data.code==0){this.callPay(json.data.data); }},  //调起支付callPay(params){var that = this;pay.xcxPay(params,function(){ uni.showToast({title:'支付成功'}); setTimeout(res=>{ uni.redirectTo({url:'/pages/my/order/detail?orderno='+that.orderno}) },1000);   },function(){ uni.showToast({title:'支付失败'}); setTimeout(res=>{ uni.redirectTo({url:'/pages/my/order/detail?orderno='+that.orderno}) },1000); }) },}}
</script>
<style>
</style>

2、util/pay.js

export
default {//小程序支付 支付参数params , scb支付成功函数, fcb支付失败函数xcxPay(params, scb, fcb) {let that = this;console.log(params);uni.requestPayment({timeStamp: params.timeStamp,// 时间戳,必填(后台传回)nonceStr: params.nonceStr,// 随机字符串,必填(后台传回)package: params.package,// 统一下单接口返回的 prepay_id 参数值,必填(后台传回)signType: params.signType,// 签名算法,非必填,(预先约定或者后台传回)paySign: params.paySign,// 签名 ,必填 (后台传回)success() {scb();},fail(err) {fcb();}})},       }

TP实现小程序支付功能,前端和后端详细实现代码。相关推荐

  1. html微信支付功能代码,微信小程序 支付功能(前端)的实现

    微信小程序 支付功能(前端)的实现 var app = getApp(); Page({ data: {},onLoad: function (options) { // 页面初始化 options为 ...

  2. 微信小程序支付功能用服务器吗,微信小程序 支付功能 服务器端(TP5.1)实现...

    首先下载微信支付SDK ,将整个目录的文件放在 /application/extend/WxPay 目录下 在使用SDK之前我们需要对 WxPay.Config.php 进行配置 namespace ...

  3. 微信小程序php后台支付,微信小程序 支付功能实现PHP实例详解

    微信小程序 支付功能实现PHP实例详解 前端代码: wx.request({ url: 'https://www.yourhost.com/weixin/WeiActivity/payJoinfee' ...

  4. python个人微信支付接口_Python实现微信小程序支付功能

    正文 由于最近自己在做小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程.当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程. 1.支付交互流程 2.获取openid( ...

  5. python微信小程序抢购_Python实现微信小程序支付功能!Python确实强的一批!

    正文 由于最近自己在做小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程.当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程. 1.支付交互流程 2.获取openid( ...

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

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

  7. SpringBoot对接微信小程序支付功能开发(二,支付回调功能)

    接着上一篇: SpringBoot对接微信小程序支付功能开发(一,下单功能) 在上一篇下单功能中我们有传支付结果回调地址. 下面是回调接口实现 package com.office.miniapp.c ...

  8. 视频教程-10分钟实现微信小程序支付功能-微信开发

    10分钟实现微信小程序支付功能 码农一枚,非著名全栈开发人员.分享自己的一些经验,学习心得,希望后来人少走弯路,少填坑. 多年全栈开发经验,擅长小程序,java,安卓,web前端开发. 邱石 ¥19. ...

  9. 微信支付,JSAPI支付,APP支付,H5支付,Native支付,小程序支付功能详情以及回调处理

    一.支付相关文档地址 支付wiki:https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml 支付api: https://pay.weixin.qq. ...

最新文章

  1. Confluence 6 的 Crowd 设置
  2. python开源系统_搭建轻量级的开源推荐系统-Python-recsys
  3. Heredoc和Nowdoc
  4. 【转】一个安全测试的CheckList
  5. linux下串口(serial)和串口驱动
  6. 小白初上手HTML+CSS 仿写小米官网logo动画
  7. 16.集合框架(ArrayList,Vector,LinkedList,泛型(Generic),可变参数,增强for循环)
  8. 基于Linux、QT、C++的“别踩白块儿”小游戏
  9. python笔记 基础语法·第0课【print & 转义字符】
  10. 有苦有乐的算法 --- 小和问题
  11. 高德地图之周边信息查询
  12. Xshell无法启动问题解决
  13. 小程序普通选择器的创建详解(我的成长之路_No.2)
  14. 一个修改Oracle用户密码的小诀窍
  15. python学习第二天(list列表和tuple元组)
  16. 数据分析系列教程之numpy(四)
  17. 【C/C++基础知识点】输出n位斐波那契数列
  18. mysql数据库删除重复的数据保留一条
  19. matlab在图片上画圆_在Matlab中识别的图像周围画一个圆圈
  20. 运动耳机排行榜前十名,六款目前最好的运动耳机推荐

热门文章

  1. 注册Google个人账号遇到“此电话号码无法用于进行验证”问题
  2. 解决官网无法下载pycharm问题
  3. 蓝桥杯第五届第四题过大年加法算式
  4. 这个小姐姐说:你之前所知道的区块链可能都是错的
  5. 甜品网页html,不急蛋糕甜品店网站静态模板
  6. linux 命令:chroot详解
  7. 设备管理器打开后显示空白的解决方法
  8. 总结:linux驱动之I2C至少四种读写方法
  9. 听了一个毕业十年学长讲座后总结的感想
  10. echarts实现比较炫的仪表盘