紅包接口調用:
在使用紅包請求功能的時候,注意mch_billno(商戶訂單號)這個參數;
商戶訂單號(每個訂單號必須唯一)
組成: mch_id+yyyymmdd+10位一天內不能重復的數字。
微信支付:
用easywechat來開發微信支付功能,步驟如下:
一,需要有一個商品下單頁面,頁面上有你的商品的信息,還要有購買數量,和一個購買按鈕。
用戶在這個頁面瀏覽商品信息的時候,可以選擇購買的數量,然后點擊提交進入下一個頁面。
(這個頁面,跟淘寶的商品購買頁面一樣。)
二,創建一個頁面,接收上面一步提交來的數據,然后做如下計算 。
1,根據商品ID或是提交來的商品信息,生成商品的參數數組。
- $product = [
- 'trade_type' => 'JSAPI', // 微信公眾號支付填JSAPI
- 'body' => '一盒火柴',
- 'detail' => '一盒火柴',
- 'out_trade_no' => 'MYERPORDERID12345678', // 這是自己ERP系統里的訂單ID,不重復就行。
- 'total_fee' => 8888, // 金額,這里的8888分人民幣。單位只能是分。
- 'notify_url' => 'http://www.xxx.com/order_notify', // 支付結果通知網址,如果不設置則會使用配置里的默認地址 (填寫發起支付請求的網址)
- 'openid' => 'you-open-id', // 這個不能少,少了要報錯。
- // ... 基本上這些參數就夠了,或者參考微信文檔自行添加刪除。
- ];
2,接下來,生成商品對象。
- $order = new Order($product);
3,再接下來,要進行調用前計算了。
- $app = new Application(config('wechat'));
- $payment = $app->payment;
- //統一下單(像公眾號支付、掃碼支付、APP支付都使用這個接口)
- $result = $payment->prepare($order); // 這里的order是上面一步得來的。 這個prepare()幫你計算了校驗碼,幫你獲取了prepareId.省心。
- //刷卡支付使用下面這個接口:
- //$result = $payment->pay($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); // 這個方法是取得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({{ $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>
沒錯,只需要修改這些。
再來理一個,第二步里,這個頁面需要顯示一個確認信息,比如商品的名稱,和支付的總金額。
頁面上應該有一個按鈕,用來觸發支付(.btn-do-it)。
頁面里的js就是第5步里要顯示的內容。
總結:
第一步,商品信息頁面,用戶選擇購買數據,點購買,提交到第二步的確認頁面。
第二步的確認頁面,根據商品信息,和微信配置信息,生成必要的支付數據,並顯示購買確認信息,和一個支付按鈕,
用戶點擊支付按鈕,發起支付。
支付完成,提示用戶,或轉到相應頁面。
微信的開發團隊提醒我們,請以微信的推送信息為准來處理訂單,不然有可能人財兩空。
product.html
- <!DOCTYPE html>
- <html lang="en">
- <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' => 'http://test.xxoo.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 lang="en">
- <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文檔就行了。