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

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

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['amount'] < $cartAmount) {
$result['msg'] = '余额不足';
$result['code'] = 0;
$this->ajaxReturn($result);
}
} // 生成订单
$order['ordersn'] = $this->genOrdersn($user['id']);
$order['price'] = $cartAmount;
$order['addressid'] = $address['id'];
$order['addressinfo'] = serialize($address); //json_encode($address);
$order['longitude'] = $address['longitude'];
$order['latitude'] = $address['latitude'];
$order['addtime'] = time();
$order['status'] = 0;
$order['userid'] = $user['id'];
$order['paytype'] = $payment;
$order['paysn'] = '';
$order['paytime'] = time();
$orderId = M("Order")->add($order);
if ($orderId == 0) {
$result['msg'] = '创建订单失败';
$result['code'] = 0;
$this->ajaxReturn($result);
}
foreach ($cart as $goods) {
$orderGoods['orderid'] = $orderId;
$orderGoods['goodsid'] = $goods['id'];
$orderGoods['title'] = $goods['title'];
$orderGoods['price'] = $goods['price'];
$orderGoods['attr'] = $goods['attr'];
$orderGoods['pic'] = $goods['pic'];
$orderGoods['num'] = $goods['selectcount'];
M("OrderGoods")->add($orderGoods);
} if ($payment == 'balance') {
// 余额支付
$this->balancePay($cartAmount, $user['wxopenid'], $orderId);
} else if ($payment == 'weixin') {
// 微信支付
$this->weixinPay($cartAmount, $user['wxopenid'], $orderId, $order['ordersn']);
}
}
/**
* 微信支付
* @author 大脸猫脸大
* @param $cart
* @param $cartAmount
* @param $address
* @param $user
*/
private function weixinPay($cartAmount, $openId, $orderId, $orderSn)
{ import("Vendor.Wxpay.lib.WxPay#Api", "", ".php");
//订单号
$money = $cartAmount * 100;
$openid = $openId;
$input = new \WxPayUnifiedOrder();
$input->SetBody("迪克-商品");
$input->SetOut_trade_no("$orderSn");
$input->SetTotal_fee("$money");
$input->SetNotify_url("https://" . $_SERVER['HTTP_HOST'] . "/api/buy/payNotify");
$input->SetTrade_type("JSAPI");
$input->SetOpenid($openid);
$unifiedOrder = \WxPayApi::unifiedOrder($input); 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->genPaySign($unifiedOrder, $time);// 之前以为是$unifiedOrder['sign']; 后来发现是调用的这种方法. 签名方案参见微信公众号支付帮助文档; $data['out_trade_no'] = $orderSn;
$data['orderid'] = $orderId;
$return['code'] = 1;
$return['data'] = $data;
} else {
Log::write(var_export($unifiedOrder, true), Log::ERR, '', C('LOG_PATH')."wx_pay_".date('y_m_d').'.log');
$return['code'] = 0;
$return['msg'] = '微信支付失败';// $unifiedOrder['RETURN_MSG'];
}
$this->ajaxReturn($return);
}
/* 生成支付签名*/
private function genPaySign($unifiedOrder, $time)
{
$appId = \WxPayConfig::APPID;
$nonceStr = $unifiedOrder['nonce_str'];
$package = 'prepay_id=' . $unifiedOrder['prepay_id'];
$signType = "MD5";
$timeStamp = $time;
$key = \WxPayConfig::KEY; $sign = md5(sprintf("appId=%s&nonceStr=%s&package=%s&signType=%s&timeStamp=%s&key=%s", $appId, $nonceStr, $package, $signType, $timeStamp, $key));
}
/**
* 支付回调
* @author:大脸猫脸大
*/
public function payNotify()
{
import("Vendor.Wxpay.lib.WxPay#Data", "", ".php");
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
$val = \WxPayResults::Init($xml); if ($val['result_code'] == 'SUCCESS' && $val['return_code'] == 'SUCCESS') { $orderSn = $val['out_trade_no'];
$transactionId = $val['transaction_id'];
$data = array('paytype' => 'weixin', 'status' => '1', 'paytime' => time(), 'paysn' => $transactionId); M("Order")->where("ordersn='$orderSn'")->setField($data);
exit('<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>');
}else {
Log::write(var_export($val, true), Log::ERR, '', C('LOG_PATH')."wx_pay_notify_".date('y_m_d').'.log');
exit('<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>');
}
}

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

<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>
 

PHP实现微信小程序支付完整版,可以借鉴!的更多相关文章

  1. Java实现微信小程序支付(完整版)

    在开发微信小程序支付的功能前,我们先熟悉下微信小程序支付的业务流程图: 不熟悉流程的建议还是仔细阅读微信官方的开发者文档. 一,准备工作 事先需要申请企业版小程序,并开通“微信支付”(即商户功能).并 ...

  2. 微信小程序支付及退款流程详解

    微信小程序的支付和退款流程 近期在做微信小程序时,涉及到了小程序的支付和退款流程,所以也大概的将这方面的东西看了一个遍,就在这篇博客里总结一下. 首先说明一下,微信小程序支付的主要逻辑集中在后端,前端 ...

  3. Asp.net Core 微信小程序支付

    最近要做一个微信小程序支付的功能 在网上找了一下 .net Core做微信支付的博客 和 demo 几乎没有 自己研究了好几天 参考了 很多 大牛的博客 勉强做出来了  因为参数都没有 比如 opid ...

  4. 微信小程序支付(企业支付给用户零钱)

    内容摘要:本案例客户端支付方式为微信小程序支付(JSAPI).商户运营一段时间后,在微信商户平台开通企业支付服务后,即可调用微信支付提供的企业付款接口将佣金等金额通过微信零钱返现给C端用户零钱. 服务 ...

  5. 微信小程序支付步骤

    http://blog.csdn.net/wangsf789/article/details/53419781 最近开发微信小程序进入到支付阶段,一直以来从事App开发,所以支付流程还是熟记于心的.但 ...

  6. Java 后端微信小程序支付demo (网上说的坑里面基本上都有)

    Java 后端微信小程序支付 一.遇到的问题 1. 商户号该产品权限未开通,请前往商户平台>产品中心检查后重试 2.签名错误 3.已经调起微信统一下单接口,可以拿到预支付ID,但是前端支付的时候 ...

  7. php对接微信小程序支付

    前言:这里我就假装你已经注册了微信小程序,并且基本的配置都已经好了.注: 个人注册小程序不支持微信支付,所以我还是假装你是企业或者个体工商户的微信小程序,其他的商户号注册,二者绑定,授权,支付开通,就 ...

  8. 微信小程序支付遇到的坑

    1,微信公众号支付和微信小程序支付有差异 微信公众号:可以直接跳转走h5的微信支付 微信小程序:在测试环境.沙箱环境使用微信公众号的跳转支付没有问题,在线上存在支付异常 最后商讨的解决方法 openi ...

  9. 微信小程序支付接入注意点

    一.微信支付后台服务器部署 服务器采用ubuntu16.04 + php7.0 + apache2.0. 微信支付后台服务使用了curl 和 samplexml ,因此php.ini配置中必须开启这两 ...

随机推荐

  1. 【学术篇】状态压缩动态规划——POJ3254/洛谷1879 玉米田Corn Field

    我要开状压dp的坑了..直播从入门到放弃系列.. 那就先拿一道状压dp的水题练练手吧.. 然后就找到了这一道..这道题使我清醒地认识到阻碍我的不是算法,而是视力= = 传送门: poj:http:// ...

  2. 代码风格JavaScript standard style与Airbnb style

    代码风格JavaScript  standard style与Airbnb style

  3. 一个windows 两个jar

    设置两个子JAVA_HOME,一个总设置两个子JAVA_HOME:JAVA_HOME6 = C:\Program Files\Java\jdk1.6.0_43JAVA_HOME8 = C:\Progr ...

  4. 牛客网在线判题系统JavaScript(V8)使用

    JavaScript作为一种弱类型的编程语言,语法和C/C++.JAVA等存在差别,但是对于大部算法题,不只是C/C++.JAVA,也依然可以使用JavaScript来实现.所以在牛客网中,如果你喜欢 ...

  5. Entity Framework(code first)数据库初始化

    //1.修改模型,重设数据库 using System.Data.Entity; Database.SetInitializer<LisknoveDataContext>(newDropC ...

  6. PAT甲级——A1006 Sign In and Sign Out

    At the beginning of every day, the first person who signs in the computer room will unlock the door, ...

  7. C语言内存布局简记待补充

    C语言存储类型总结内存操作函数总结 用于自己学习和记录 1. void *memset(void *s, int c, size_t n); #include <string.h> 功能: ...

  8. Mobox 知识管理平台助推市长质量奖

    Mobox 知识管理平台助推市长质量奖 引言: 在过去的十多年中,国际上在管理领域出现两股浪潮:一是许多国家和地区采取设立政府质量奖的方式,来改善企业管理绩效,提升区域整体竞争力:二是这些国家和地区的 ...

  9. linux服务器项目搭建常用命令

    linux下载链接文件 wget -c 后面是该网络地址和文件的位置. 例如:wget -c http://apache.opncas.or/MySQL/MySQL-7/v7.0.67/bin/MyS ...

  10. 你所不知道的Mac截图的强大

    Mac的截图功能扩展功能很强大的,不要用QQ那个COM+Ctrl+A弱爆了的截图了~ 首先说一下两种截图 1.Command+shift+3:全屏截图,保存截图到桌面 2.Command+shift+ ...