天天看點

php 微信公衆号支付

微信公衆号支付用于使用者在微信内使用自己的網頁進行支付

一、一般的流程為:

    (1)、商戶下發圖文消息或者通過自定義菜單吸引使用者點選進入商戶網頁。

    (2)、進入商戶網頁,使用者選擇購買,完成選購流程。

    (3)、調起微信支付控件,使用者開始輸入支付密碼。

    (4)、密碼驗證通過,支付成功。商戶背景得到支付成功的通知。

    (5)、傳回商戶頁面,顯示購買成功。該頁面由商戶自定義。

    (6)、微信支付公衆号下發支付憑證。

    (7)、商戶公衆号下發消息,提示發貨成功。該步驟可選。或是商戶app/網站發送消息 提示購買成功。

二、互動細節:

    以下是支付場景的互動細節,請認真閱讀,設計商戶頁面的邏輯:

    (1)使用者打開商戶網頁選購商品,發起支付,在網頁通過JavaScript調用getBrandWCPayRequest接口,發起微信支付請求,使用者進入支付流程。

    (2)使用者成功支付點選完成按鈕後,商戶的前端會收到JavaScript的傳回值。商戶可直接跳轉到支付成功的靜态頁面進行展示。

    (3)商戶背景收到來自微信開放平台的支付成功回調通知,标志該筆訂單支付成功。

注:(2)和(3)的觸發不保證遵循嚴格的時序。JS API傳回值作為觸發商戶網頁跳轉的标志,但商戶背景應該隻在收到微信背景的支付成功回調通知後,才做真正的支付成功的處理。

三、開發配置

    (1)設定支付目錄

        請確定實際支付時的請求目錄與背景配置的目錄一緻,否則将無法成功喚起微信支付。

        在微信商戶平台(pay.weixin.qq.com)設定您的公衆号支付支付目錄,設定路徑:商戶平台-->産品中心-->開發配置。

        公衆号支付在請求支付的時候會校驗請求來源是否有在商戶平台做了配置,是以必須確定支付目錄已經正确的被配置,否則将驗證失敗,請求支付不成功。

    (2)設定授權域名

        開發公衆号支付時,在統一下單接口中要求必傳使用者openid,而擷取openid則需要您在公衆平台設定擷取openid的域名,隻有被設定過的域名才是一個有效的擷取openid的域名,否則将擷取失敗。

php 微信公衆号支付

四、微信内H5調起支付

    getBrandWCPayRequest參數以及傳回值定義:

php 微信公衆号支付

get_brand_wcpay_request:ok 支付成功

get_brand_wcpay_request:cancel 支付過程中使用者取消

get_brand_wcpay_request:fail 支付失敗

調用支付JSAPI缺少參數:total_fee 請檢查預支付會話辨別prepay_id是否已失效

js 的代碼如下

function onBridgeReady(){

   WeixinJSBridge.invoke(

       'getBrandWCPayRequest', {

           "appId":"wx2421b1c4370ec43b",     //公衆号名稱,由商戶傳入     

           "timeStamp":"1395712654",         //時間戳,自1970年以來的秒數     

           "nonceStr":"e61463f8efa94090b1f366cccfbbb444", //随機串     

           "package":"prepay_id=u802345jgfjsdfgsdg888",     

           "signType":"MD5",         //微信簽名方式:     

           "paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信簽名 

       },

       function(res){     

           if(res.err_msg == "get_brand_wcpay_request:ok" ) {}     // 使用以上方式判斷前端傳回,微信團隊鄭重提示:res.err_msg将在使用者支付成功後傳回    ok,但并不保證它絕對可靠。 

       }

   ); 

}

if (typeof WeixinJSBridge == "undefined"){

   if( document.addEventListener ){

       document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);

   }else if (document.attachEvent){

       document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 

       document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);

   }

}else{

   onBridgeReady();

}

php的代碼如下

<?php 

require_once "../lib/WxPay.Api.php";

require_once "WxPay.JsApiPay.php";

//①、擷取使用者openid

$tools = new JsApiPay();

$openId = $tools->GetOpenid();

//②、統一下單

$input = new WxPayUnifiedOrder();

$input->SetBody("test");

$input->SetAttach("test");

$input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));

$input->SetTotal_fee("1");

$input->SetTime_start(date("YmdHis"));

$input->SetTime_expire(date("YmdHis", time() + 600));

$input->SetGoods_tag("test");

$input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");

$input->SetTrade_type("JSAPI");

$input->SetOpenid($openId);

$order = WxPayApi::unifiedOrder($input);

echo '<font color="#f00"><b>統一下單支付單資訊</b></font><br/>';

printf_info($order);

$jsApiParameters = $tools->GetJsApiParameters($order); 

注意要将 jsApiParameters  參數傳回代上個js的getBrandWCPayRequest 中

?>

其中 PHP方面要注意的是 

1、擷取使用者公衆号的openid  會調用這個方法兩次

2、公衆号支付配置 appid 一定是公衆号的appid

public function GetOpenid()

{

//通過code獲得openid

if (!isset($_GET['code'])){

//觸發微信傳回code碼

$baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].$_SERVER['QUERY_STRING']);

$url = $this->__CreateOauthUrlForCode($baseUrl);

Header("Location: $url");

exit();

} else {

//擷取code碼,以擷取openid

    $code = $_GET['code'];

$openid = $this->getOpenidFromMp($code);

return $openid;

}

}