easywechat是神一样的存在。非常好用。希望大家都能转到这上面来。
用easywechat来开发微信支付功能,步骤如下:
一,需要有一个商品下单页面,页面上有你的商品的信息,还要有购买数量,和一个购买按钮。用户在这个页面浏览商品信息的时候,可以选择购买的数量,然后点击提交进入下一个页面。(这个页面,跟淘宝的商品购买页面一样。)
二,创建一个页面,接收上面一步提交来的数据,然后做如下计算 。
1,根据商品ID或是提交来的商品信息,生成商品的参数数组。
$product = [ 'trade_type' => 'JSAPI', // 微信公众号支付填JSAPI 'body' => '一盒火柴', 'detail' => '一盒火些', 'out_trade_no' => 'MYERPORDERID12345678', // 这是自己ERP系统里的订单ID,不重复就行。 'total_fee' => 8888, // 金额,这里的8888分人民币。单位只能是分。 'notify_url' => 'https://www.df81.com/order_notify', // 支付结果通知网址,如果不设置则会使用配置里的默认地址 'openid' => 'you-open-id', // 这个不能少,少了要报错。 // ... 基本上这些参数就够了,或者参考微信文档自行添加删除。 ];
2,接下来,生成商品对象。
$order = new Order($product);
3,再接下来,要进行调用前计算了。
$app = new Application(config('wechat')); $payment = $app->payment; $result = $payment->prepare($order); // 这里的order是上面一步得来的。 这个prepare()帮你计算了校验码,帮你获取了prepareId.省心。 $prepayId = null; if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS'){ $prepayId = $result->prepay_id; // 这个很重要。有了这个才能调用支付。 } else { var_dump($result); die("出错了。"); // 出错就说出来,不然还能怎样? } $config = $payment->configForJSSDKPayment($prepayId); // 这个方法是取得js里支付所必须的参数用的。 没这个啥也做不了,除非你自己把js的参数生成一遍
4,就快进入正题,但是,还没完。还要取得一个数据。
$app = new Application(config('wechat')); $js = $app->js; // 这个是jssdk里页面上需要用到的js参数信息。
5,上面获得的$js 和 $config数据,要在页面里显示出来。
注意,上面几步都不涉及显示,只是在生成页面显示所需要的数据。
现在才需要把这些显示在页面上。
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript" charset="utf-8"> wx.config({{ <span style="font-family: Arial, Helvetica, sans-serif;">$js->config(array('chooseWXPay')) </span><span style="font-family: Arial, Helvetica, sans-serif;">}}); </span> </script> <script> $(function(){ $(".btn-do-it").click(function(){ wx.chooseWXPay({ timestamp: "{{$config['timestamp']}}", // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 nonceStr: '{{$config['nonceStr']}}', // 支付签名随机串,不长于 32 位 package: '{{$config['package']}}', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***) signType: '{{$config['signType']}}', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' paySign: '{{$config['paySign']}}', // 支付签名 success: function (res) { // 支付成功后的回调函数 if(res.err_msg == "get_brand_wcpay_request:ok" ) { alert('支付成功。'); window.location.href="{{url("wechat/pay_ok")}}"; }else{ //alert(res.errMsg); alert("支付失败,请返回重试。"); } }, fail: function (res) { alert("支付失败,请返回重试。"); } }); }); }); </script>
没错,只需要修改这些。
再来理一个,第二步里,这个页面需要显示一个确认信息,比如商品的名称,和支付的总金额。
页面上应该有一个按钮,用来触发支付(.btn-do-it)。
页面里的js就是第5步里要显示的内容。
总结:
第一步,商品信息页面,用户选择购买数据,点购买,提交到第二步的确认页面。
第二步的确认页面,根据商品信息,和微信配置信息,生成必要的支付数据,并显示购买确认信息,和一个支付按钮,
用户点击支付按钮,发起支付。
支付完成,提示用户,或转到相应页面。
微信的开发团队提醒我们,请以微信的推送信息为准来处理订单,不然有可能人财两空。
-分隔-
product.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>一盒火柴</title> </head> <body> <h1>一盒火柴</h1> <div> 卖火柴的小女孩,手里有一堆火柴。 </div> <hr> <div> <form name="form1" action="payment.php" method="post"> <lable>数量:</lable> <input name="qty" value="1" /> <input name="submit" type="submit" value="购买" /> </form> </div> </body> </html>
payment.php
<?php use EasyWeChat\Foundation\Application; use EasyWeChat\Payment\Order; $product = [ 'body' => '一盒火柴', 'trade_type' => 'JSAPI', 'out_trade_no' => 'ERP'.time(), 'total_fee' => 1, 'notify_url' => 'https://www.df81.com/wechat/notify/', 'openid' => $_SESSION['openid'], 'attach' => '卖火柴的小女孩', ]; $order = new Order($product); $app = new Application(config('wechat')); $js = $app->js; $payment = $app->payment; $result = $payment->prepare($order); $prepayId = null; if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS'){ $prepayId = $result->prepay_id; } else { var_dump($result); die("出错了。"); } $config = $payment->configForJSSDKPayment($prepayId); ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>购买支付</title> </head> <body> <h1>一盒火柴</h1> <div> <p>您购买了“一盒火柴”,总价格: 0.01元。</p> <p>数量:1盒。</p> </div> <hr> <div> <input name="button" id="btnPay" type="button" value="支付" /> </div> <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js" type="text/javascript" charset="utf-8"></script> <script type="text/javascript" charset="utf-8"> wx.config({{ $js->config(array('chooseWXPay')) }}); </script> <script> $(function(){ $(".btn-do-it").click(function(){ wx.chooseWXPay({ timestamp: "{{$config['timestamp']}}", // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 nonceStr: '{{$config['nonceStr']}}', // 支付签名随机串,不长于 32 位 package: '{{$config['package']}}', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***) signType: '{{$config['signType']}}', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' paySign: '{{$config['paySign']}}', // 支付签名 success: function (res) { // 支付成功后的回调函数 if(res.err_msg == "get_brand_wcpay_request:ok" ) { alert('支付成功。'); window.location.href="{{url("wechat/pay_ok")}}"; }else{ //alert(res.errMsg); alert("支付失败,请返回重试。"); } }, fail: function (res) { alert("支付失败,请返回重试。"); } }); }); }); </script> </body> </html>
这些是伪代码,payment.php并没有对product.html传来的商品信息做处理。
其实只要看payment.php文件应该知道怎么做了。
其它就两点。a,获取$config,b, 自己写wx.chooseWXPay。
其它的看easywechat文档就行了。
上一篇: 《建站管家》二次开发文档