1. 程式人生 > >php 實現微信退款

php 實現微信退款

大家好,我是小編,最近在調微信退款介面,發現有許多坑,更大家分享一下

① 要是在測試的時候,網頁提示 curl 58 說明 證書的路徑出現問題(這裡要填物理路徑,也就是絕對路徑)

②網頁提示curl 52 說明你的證書引入少了,在官方的demo上只有兩個證書 apiclient_cert.pem和 apiclient_key.pem  你還需要引入一個證書 rootca.pem,這個證書需要你登入到

你的商戶平臺上下載

3.要是網頁提示  "HTTP/1.1 200 OK Server: nginx Date: Tue, 20 Jun 2017 08:08:01 GMT Content-Type: text/plain Content-Length: 852 Connection: keep-alive Keep-Alive: timeout=8

說明你的程式碼是沒有問題的 ,應該是引數出錯了 我之前錯的地方是把 out_refund_no和 out_trade_no寫的一樣,微信官網上也是這樣寫的 ,但是就是出現問題,我把out_refund_no 修改了一下 發現可以了

注意:金額的單位是分 

下面就是我寫的介面

function Home_index() {
    
    date_default_timezone_set("Asia/Shanghai");
    $date = date("YmdHis");
    $appid = "";
    $mch_id = "";
    $out_trade_no = "14487658021497944120";
    $op_user_id = "";
    $out_refund_no = $date;
    $total_fee = "500";
    $refund_fee = "500";
//    $transaction_id = "4009542001201706206596667604";
    $key = "";
    $nonce_str = nonceStr();

    $ref = strtoupper(md5("appid=$appid&mch_id=$mch_id&nonce_str=$nonce_str&op_user_id=$op_user_id"
                    . "&out_refund_no=$out_refund_no&out_trade_no=$out_trade_no&refund_fee=$refund_fee&total_fee=$total_fee"
                    . "&key=$key")); //sign加密MD5

    $refund = array(
    'appid' =>$appid, //應用ID,固定
    'mch_id' => $mch_id, //商戶號,固定
    'nonce_str' => $nonce_str, //隨機字串
    'op_user_id' => $op_user_id, //操作員
    'out_refund_no' => $out_refund_no, //商戶內部唯一退款單號
    'out_trade_no' => $out_trade_no, //商戶訂單號,pay_sn碼 1.1二選一,微信生成的訂單號,在支付通知中有返回
    // 'transaction_id'=>'1',//微信訂單號 1.2二選一,商戶側傳給微信的訂單號
    'refund_fee' => $refund_fee, //退款金額
    'total_fee' => $total_fee, //總金額
    'sign' => $ref//簽名
    );

    $url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
    ; //微信退款地址,post請求
    $xml = arrayToXml($refund);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1); //證書檢查
    if ($useCert == true) {
        // 設定證書
        curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'pem');
        curl_setopt($ch, CURLOPT_SSLCERT, dirname(__FILE__) . '/WxPay/cert/apiclient_cert.pem');
        curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'pem');
        curl_setopt($ch, CURLOPT_SSLKEY, dirname(__FILE__) . '/WxPay/cert/apiclient_key.pem');
        curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'pem');
        curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/WxPay/cert/rootca.pem');
    }
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

    $xml = curl_exec($ch);


    // 返回結果0的時候能只能表明程式是正常返回不一定說明退款成功而已
    if ($xml) {
        curl_close($ch);
        // 把xml轉化成陣列
        libxml_disable_entity_loader(true);
        $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
//        var_dump($xmlstring);
        $result['errNum'] = 0;
        $result['info'] = object_to_array($xmlstring);
//        var_dump($result);
        return $result;
    } else {
        $error = curl_errno($ch);
        curl_close($ch);
        // 錯誤的時候返回錯誤碼。
        $result['errNum'] = $error;
        return $result;
    }
}

function arrayToXml($arr) {
    $xml = "<root>";
    foreach ($arr as $key => $val) {
        if (is_array($val)) {
            $xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";
        } else {
            $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
        }
    }
    $xml .= "</root>";
    return $xml;
}
function object_to_array($obj) {
    $obj = (array) $obj;
    foreach ($obj as $k => $v) {
        if (gettype($v) == 'resource') {
            return;
        }
        if (gettype($v) == 'object' || gettype($v) == 'array') {
            $obj[$k] = (array) object_to_array($v);
        }
    }


    return $obj;
}

function nonceStr() {
    $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
    $str = "";
    $length = 32;
    for ($i = 0; $i < $length; $i++) {
        $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    }
    // 隨機字串  
    return $str;
}

Home_index();

趕快新增到你的專案中去吧

相關推薦

PHP實現退款的分析與原始碼實現

* 1.微信退款到零錢要求必傳證書,需要到https://pay.weixin.qq.com 賬戶中心->賬戶設定->API安全->下載證書,然後修改程式碼中的證書路徑  * 2.該檔案需放到支付授權目錄下,可以在微信支付商戶平臺->產品中心->開發配置中設定。&nb

php 實現退款

大家好,我是小編,最近在調微信退款介面,發現有許多坑,更大家分享一下 ① 要是在測試的時候,網頁提示 curl 58 說明 證書的路徑出現問題(這裡要填物理路徑,也就是絕對路徑) ②網頁提示curl 52 說明你的證書引入少了,在官方的demo上只有兩個證書 apiclie

PHP實現支付(jsapi支付)和退款(無需整合支付SDK

1.PHP實現微信支付(jsapi支付)流程 2.ThinkPHP中實現微信支付(jsapi支付)流程 3.PHP實現微信申請退款 這幾篇都是使用了微信官方給的PHP版本的SDK,進行支付的時候寫程式碼可以省不少事,步驟也挺簡化,但是整合SDK有很多坑,很多人說

PHP實現申請退款

前面講了怎麼實現微信支付,詳見博文:PHP實現微信支付(jsapi支付)流程 和ThinkPHP中實現微信支付(jsapi支付)流程。由於業務需求,還需要有微信退款,經過研究和摸索,也終於搞定了。 前期準備: 當然是搞定了微信支付,不然怎麼退款,這次還

php實現分享朋友圈

public private abcd ushare name preview set PE char class JSSDK { private $appId; private $appSecret; public function __construct($a

PHP實現模板訊息傳送給指定使用者

收到很多童鞋的諮詢,利用微信公眾號的介面能不能給某個使用者傳送訊息呢,如果說直接傳送呢那還真有些限制,一個是客服訊息介面,但是這個需要使用者在48小時內和公眾號有互動才可以傳送。另外一個就是微信的模板訊息,這個沒有傳送時間限制,但是微信為了防止一些垃圾資料需要使用模板才可以傳送。相信我們平時也收到很

PHP 實現企業付款到使用者零錢

一.實現該功能目的     這幾天在小程式裡要實現使用者從系統中提現到零錢的功能,查了一下文件可以使用 企業付款到使用者零錢 來實現;  官方文件:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapt

PHP實現支付(小程式版)

先解答上一篇部落格中form_id的獲取方法: js程式碼 Page({ formSubmit: function (e) { console.log("formid:"+e.detail.formId) }, }) wxml程式碼 <

PHP實現開發中提現功能(企業付款到使用者零錢)

一.實現該功能目的     這幾天在小程式裡要實現使用者從系統中提現到零錢的功能,查了一下文件可以使用 企業付款到使用者零錢 來實現;  官方文件:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapt

php實現企業向用戶付款

<?php header('content-type:text/html;charset=utf-8'); $data['mch_appid']='##################';//商戶的應用appid $data['mchid']='##########

java實現退款

微信退款之前需要在常量中配置退款地址,退款的地址必須是可以直接訪問的。(之前的申請商戶平臺及在開放平臺申請賬號不在描述)在調起之前需要下載商戶平臺上的證書將其放在專案src下。 微信退款回撥url :微信官方建議在提交退款申請後進行退款回撥url配置,便於

PHP實現推送模板訊息

原文:https://blog.csdn.net/haoyunyun888/article/details/85857638  版權宣告:本文為博主原創文章,轉載請附上博文連結! 案例效果: 應用場景: 模板通知應用場景: 1.撕名牌通知 2.組織人員通知 3.Wp

小程式與php 實現支付

小程式訪問地址: payfee.php: include 'WeixinPay.php'; $appid=''; $openid= $_GET['id']; $mch_id=''; $key=''; $out_trade_no = $mch_id. time(); $t

PHP實現支付功能開發+例項程式碼

namespace Wechat\Controller; use Think\Controller; /** * 父類控制器,需要繼承 * @file ParentController.class.php * @author Gary <[email protected]> *

PHP實現公眾平臺開發---提升篇(access_token存session)

cURL簡單採集 初始化 cURL  $c = curl_init() 設定cURL   設定URL curl_setopt($c , CURLOPT_URL, ‘’) 以檔案流返回  curl_setopt($c , CURLOPT_RETURNTRANSFER,t

php實現公眾號主動推送訊息

通過學習借鑑朋友的實現方法進行整理,實現了PHP版的微信公共平臺訊息主動推送,分享給大家供大家參考,具體內容如下 此方法是通過模擬登入微信公共平臺的方法來實現的。 程式碼如下:一、登入介面部分程式碼 //登入 private function login(){ $url

PHP實現 --分享朋友連結

不是些高深知識,但是第一次做,確實費了很多的時間.終於一點一點的扣了出來. 目前已經使用中. 解決這個問題,總共碰到了幾次BUG,1是生成的簽名不對,自己打印出來,在去微信的簽名演算法頁面一一核對.這時候如果對了,還是不成功.那就是需要動態獲取URL連結的.最

PHP實現公眾平臺開發---提升篇(模板訊息介面)

模版訊息 介面 模板訊息僅用於公眾號向用戶傳送重要的服務通知,只能用於符合其要求的服務場景中,如信用卡刷卡通知,商品購買成功通知等。不支援廣告等營銷類訊息以及其它所有可能對使用者造成騷擾的訊息。 規則 所有服務號都可以在功能->新增功能外掛處看到申請模板訊息功

使用PHP+MySql操作——實現投票功能

lis 結果 ansi 代號 his html back utf-8 微信 1. 投票主頁面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/