热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php充值支付程序,php实现小程序支付完整版

本文实例为大家分享了php实现小程序支付的具体代码,供大家参考,具体内容如下环境:tp3.2小程序微信支付功能开通step1:下载php支

本文实例为大家分享了php实现小程序支付的具体代码,供大家参考,具体内容如下

环境: tp3.2  + 小程序 微信支付功能开通

step1:下载php 支付sdk()  放到library\vendor下,取名wxpay

修改wxpay.config.php 里的appid appsecret key mchid

step2:小程序 js 代码:

var url = getapp().globaldata.httpserver + 'api/buy/pay';

var userid = getapp().globaldata.userid;

var totalmoney = this.data.totalmoney;

var cart = this.data.goods;

var param = {

cart: json.stringify(cart),

cartamount: totalmoney,

userid: userid,

payment: this.data.payment,

addressid: defaultaddress.id

};

var that = this;

util.http(url, param, function (ret) {

if (ret.data.code == 1) {

if (that.data.payment == 'balance') { // 余额支付

that.afterpaysuccess(ret.data.data);

} else { // 微信支付

wx.requestpayment({

timestamp: ret.data.data.timestamp,

noncestr: ret.data.data.noncestr,

package: ret.data.data.package,

signtype: ret.data.data.signtype,

paysign: ret.data.data.paysign,

'success': function (res) {

that.afterpaysuccess(ret.data.data.orderid);

},

'fail': function (res) {

console.log(res);

}

})

}

} else {

util.showtip(ret.data.msg, '提交订单失败');

}

});

/**

* 网络请求

*/

function http(url, params, callback) {

wx.request({

url: url,

data: params,

success: function (res) {

callback(res);

},

fail: function (err) {

console.log(err);

}

});

}

step3:接口代码:

public function pay()

{

$cart = i('cart', '', 'trim');

$cartamount = i('cartamount');

$addressid = i('addressid', 0, 'intval');

$payment = i('payment', '', 'trim');

$userid = $this->userid;

$cart = json_decode($cart, true);

if (empty($cart)) {

$result['msg'] = '购物车获取失败';

$result['code'] = 0;

$this->ajaxreturn($result);

}

$totalmoney = 0;

foreach ($cart as $goods) {

$money = $goods['price']; // price

$selectcount = $goods['selectcount']; // price

$itemamount = number_format($money * $selectcount, 2, '.', '');

$totalmoney += $itemamount;

}

// 检查总金额是否一致

if ($totalmoney != $cartamount) {

$result['msg'] = '总金额不匹配:' . $totalmoney;

$result['code'] = 0;

$this->ajaxreturn($result);

}

// 获取用户地址

$address = m('memberaddress')->where('userid=' . $userid . " and id=" . $addressid)->find();

if (empty($address)) {

$result['msg'] = '用户地址不存在';

$result['code'] = 0;

$this->ajaxreturn($result);

}

// 用户信息

$user = m('member')->where("id=" . $userid)->find();

if ($payment == 'balance') {

if ($user[&#39;amount&#39;] <$cartamount) {

$result[&#39;msg&#39;] &#61; &#39;余额不足&#39;;

$result[&#39;code&#39;] &#61; 0;

$this->ajaxreturn($result);

}

}

// 生成订单

$order[&#39;ordersn&#39;] &#61; $this->genordersn($user[&#39;id&#39;]);

$order[&#39;price&#39;] &#61; $cartamount;

$order[&#39;addressid&#39;] &#61; $address[&#39;id&#39;];

$order[&#39;addressinfo&#39;] &#61; serialize($address); //json_encode($address);

$order[&#39;longitude&#39;] &#61; $address[&#39;longitude&#39;];

$order[&#39;latitude&#39;] &#61; $address[&#39;latitude&#39;];

$order[&#39;addtime&#39;] &#61; time();

$order[&#39;status&#39;] &#61; 0;

$order[&#39;userid&#39;] &#61; $user[&#39;id&#39;];

$order[&#39;paytype&#39;] &#61; $payment;

$order[&#39;paysn&#39;] &#61; &#39;&#39;;

$order[&#39;paytime&#39;] &#61; time();

$orderid &#61; m("order")->add($order);

if ($orderid &#61;&#61; 0) {

$result[&#39;msg&#39;] &#61; &#39;创建订单失败&#39;;

$result[&#39;code&#39;] &#61; 0;

$this->ajaxreturn($result);

}

foreach ($cart as $goods) {

$ordergoods[&#39;orderid&#39;] &#61; $orderid;

$ordergoods[&#39;goodsid&#39;] &#61; $goods[&#39;id&#39;];

$ordergoods[&#39;title&#39;] &#61; $goods[&#39;title&#39;];

$ordergoods[&#39;price&#39;] &#61; $goods[&#39;price&#39;];

$ordergoods[&#39;attr&#39;] &#61; $goods[&#39;attr&#39;];

$ordergoods[&#39;pic&#39;] &#61; $goods[&#39;pic&#39;];

$ordergoods[&#39;num&#39;] &#61; $goods[&#39;selectcount&#39;];

m("ordergoods")->add($ordergoods);

}

if ($payment &#61;&#61; &#39;balance&#39;) {

// 余额支付

$this->balancepay($cartamount, $user[&#39;wxopenid&#39;], $orderid);

} else if ($payment &#61;&#61; &#39;weixin&#39;) {

// 微信支付

$this->weixinpay($cartamount, $user[&#39;wxopenid&#39;], $orderid, $order[&#39;ordersn&#39;]);

}

}

/**

* 微信支付

* &#64;author 大脸猫脸大

* &#64;param $cart

* &#64;param $cartamount

* &#64;param $address

* &#64;param $user

*/

private function weixinpay($cartamount, $openid, $orderid, $ordersn)

{

import("vendor.wxpay.lib.wxpay#api", "", ".php");

//订单号

$money &#61; $cartamount * 100;

$openid &#61; $openid;

$input &#61; new \wxpayunifiedorder();

$input->setbody("迪克-商品");

$input->setout_trade_no("$ordersn");

$input->settotal_fee("$money");

$input->setnotify_url("https://" . $_server[&#39;http_host&#39;] . "/api/buy/paynotify");

$input->settrade_type("jsapi");

$input->setopenid($openid);

$unifiedorder &#61; \wxpayapi::unifiedorder($input);

if ($unifiedorder[&#39;result_code&#39;] &#61;&#61; &#39;success&#39; && $unifiedorder[&#39;return_code&#39;] &#61;&#61; &#39;success&#39;) {

$time &#61; time();

$data[&#39;timestamp&#39;] &#61; "$time"; //时间戳

$data[&#39;noncestr&#39;] &#61; $unifiedorder[&#39;nonce_str&#39;]; //随机字符串

$data[&#39;signtype&#39;] &#61; &#39;md5&#39;; //签名算法&#xff0c;暂支持 md5

$data[&#39;package&#39;] &#61; &#39;prepay_id&#61;&#39; . $unifiedorder[&#39;prepay_id&#39;]; //统一下单接口返回的 prepay_id 参数值&#xff0c;提交格式如&#xff1a;prepay_id&#61;*

$data[&#39;paysign&#39;] &#61; $this->genpaysign($unifiedorder, $time);// 之前以为是$unifiedorder[&#39;sign&#39;]; 后来发现是调用的这种方法. 签名方案参见微信公众号支付帮助文档;

$data[&#39;out_trade_no&#39;] &#61; $ordersn;

$data[&#39;orderid&#39;] &#61; $orderid;

$return[&#39;code&#39;] &#61; 1;

$return[&#39;data&#39;] &#61; $data;

} else {

log::write(var_export($unifiedorder, true), log::err, &#39;&#39;, c(&#39;log_path&#39;)."wx_pay_".date(&#39;y_m_d&#39;).&#39;.log&#39;);

$return[&#39;code&#39;] &#61; 0;

$return[&#39;msg&#39;] &#61; &#39;微信支付失败&#39;;// $unifiedorder[&#39;return_msg&#39;];

}

$this->ajaxreturn($return);

}

/* 生成支付签名*/

private function genpaysign($unifiedorder, $time)

{

$appid &#61; \wxpayconfig::appid;

$noncestr &#61; $unifiedorder[&#39;nonce_str&#39;];

$package &#61; &#39;prepay_id&#61;&#39; . $unifiedorder[&#39;prepay_id&#39;];

$signtype &#61; "md5";

$timestamp &#61; $time;

$key &#61; \wxpayconfig::key;

$sign &#61; md5(sprintf("appid&#61;%s&noncestr&#61;%s&package&#61;%s&signtype&#61;%s×tamp&#61;%s&key&#61;%s", $appid, $noncestr, $package, $signtype, $timestamp, $key));

}

/**

* 支付回调

* &#64;author:大脸猫脸大

*/

public function paynotify()

{

import("vendor.wxpay.lib.wxpay#data", "", ".php");

$xml &#61; $globals[&#39;http_raw_post_data&#39;];

$val &#61; \wxpayresults::init($xml);

if ($val[&#39;result_code&#39;] &#61;&#61; &#39;success&#39; && $val[&#39;return_code&#39;] &#61;&#61; &#39;success&#39;) {

$ordersn &#61; $val[&#39;out_trade_no&#39;];

$transactionid &#61; $val[&#39;transaction_id&#39;];

$data &#61; array(&#39;paytype&#39; &#61;> &#39;weixin&#39;, &#39;status&#39; &#61;> &#39;1&#39;, &#39;paytime&#39; &#61;> time(), &#39;paysn&#39; &#61;> $transactionid);

m("order")->where("ordersn&#61;&#39;$ordersn&#39;")->setfield($data);

exit(&#39;&#39;);

}else {

log::write(var_export($val, true), log::err, &#39;&#39;, c(&#39;log_path&#39;)."wx_pay_notify_".date(&#39;y_m_d&#39;).&#39;.log&#39;);

exit(&#39;&#39;);

}

}

paynotify 回调方法里一定要注意返回

如果不处理&#xff0c;你会发现paynotify  会被执行很多次参见&#xff1a;官方文档

总结一下&#xff1a;

注意二点&#xff0c;1.签名的问题 2. 回调方法的返回处理。

欢迎大家指正。

以上就是本文的全部内容&#xff0c;希望对大家的学习有所帮助&#xff0c;也希望大家多多支持萬仟网。

希望与广大网友互动&#xff1f;&#xff1f;

点此进行留言吧&#xff01;



推荐阅读
  • HTML前端开发:UINavigationController与页面间数据传递详解
    本文详细介绍了如何在HTML前端开发中利用UINavigationController进行页面管理和数据传递,适合初学者和有一定基础的开发者学习。 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 调试利器SSH隧道
    在开发微信公众号或小程序的时候,由于微信平台规则的限制,部分接口需要通过线上域名才能正常访问。但我们一般都会在本地开发,因为这能快速的看到 ... [详细]
  • 从CodeIgniter中提取图像处理组件
    本指南旨在帮助开发者在未使用CodeIgniter框架的情况下,如何独立使用其强大的图像处理功能,包括图像尺寸调整、创建缩略图、裁剪、旋转及添加水印等。 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 微信小程序开发指南:创建动态电影选座界面
    本文详细介绍如何在微信小程序中实现一个动态且可视化的电影选座组件,提高用户体验。通过合理的布局和交互设计,使用户能够轻松选择心仪的座位。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 本文介绍了.hbs文件作为Ember.js项目中的视图层,类似于HTML文件的功能,并详细讲解了如何在Ember.js应用中集成Bootstrap框架及其相关组件的方法。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • 本文探讨了如何将个人经历,特别是非传统的职业路径,转化为职业生涯中的优势。通过作者的亲身经历,展示了舞蹈生涯对商业思维的影响。 ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • 解决JavaScript中法语字符排序问题
    在开发一个使用JavaScript、HTML和CSS的Web应用时,遇到从SQLite数据库中提取的法语词汇排序不正确的问题,特别是带重音符号的字母未按预期排序。 ... [详细]
  • 新浪微博热搜暂停更新;即刻APP回归;Android 11 Beta版发布 | 科技新闻速递
    为您带来最新的科技资讯,涵盖社交媒体动态、软件更新及行业重大事件。CSDN携手您共同关注科技前沿。 ... [详细]
  • 如何高效解决Android应用ANR问题?
    本文介绍了ANR(应用程序无响应)的基本概念、常见原因及其解决方案,并提供了实用的工具和技巧帮助开发者快速定位和解决ANR问题,提高应用的用户体验。 ... [详细]
author-avatar
梅爱敏_629
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有