próbuję podpiąć cashbill api do skryptu php. Pobrałem więc ich oficjalne sdk, wrzuciłem na serwer, uzupełniłem o sysID i privKey (dane w 100% prawidłowe), jednak po kliknięciu linku 'Sprzedaz kodu' otrzymuję komunikat ze strony https://ppp.cashbill.pl/pay/get/ o treści: 'Signature mismatch'. Miał ktoś może podobny problem? Być może to ja coś źle robię. Proszę o pomoc.
PS. Zamieszczam tutaj jeszcze wszystkie pliki jakie dostarcza 'sdk':
cashbillCode.php:
<?php /** * 2010-02-19 cashbillCode.php * * @author Mariusz Chwalba <koder at cashbill dot pl> * @copyright 2010 Media Systems * @package ppp2 * * Pakiet obsługi sprzedaży kodów internetowych. */ /** * @page intercodes Kody Internetowe * * Sprzedaż kodów internetowych jest formą pobierania opłat za korzystanie * z usług serwisu internetowego umożliwiającą uczestnictwo w Programie * Partnerskim Cashbill. * * Zakup kodu następuje poprzez kanały płatności internetowych. * * Serwis partnera ma możliwość wygenerowania dowolnego kodu dla klienta. * Nowo wygenerowany kod jest nieaktywny. Po dokonaniu płatności * system Cashbill informuje partnera o konieczności aktywacji danego kodu. * * Śledzenie aktywności kodu wykonywane jest przez serwis partnera, umożliwiając * świadczenie szerokiej gamy usług. */ /** * Klasa obsługi sprzedaży kodów internetowych. * Dostarcza narzędzia do * przygotowania nowej transakcji sprzedaży kodów, weryfikacji powiadomienia * poprawnej sprzedaży oraz obsługę programu partnerskiego. */ class cCashbillCode { const CASHBILL_URL = 'https://ppp.cashbill.pl/'; protected $sysId, $secret, $encoding; /** * Inicjalizacja usługi. * Konieczne parametry identyfikacyjne dla * punktu płatności można odczytać z panelu cashbill.pl. * * @param string $sysId * - identyfikator serwisu, z panelu cashbill.pl * @param string $secret * - klucz tajny serwisu, z panelu cashbill.pl * @param string $encoding * - wykorzystywane kodowanie znaków w opisie transakcji. Domyślne UTF-8 */ public function __construct($sysId, $secret, $encoding = 'UTF-8') { $this->sysId = $sysId; $this->secret = $secret; $this->encoding = $encoding; } /** * Pomocnicza funkcja generująca losowy kod alfanumeryczny * * @param number $length */ $namespace = strtoupper ( 'abcedfghijkmnpqrstuvwxyz' ); // ograniczona przestrzeń znaków by zapobiec pomyłkom $code = ''; for($j = 0; $j < $length; $j ++) { } return $code; } /** * Pobranie URL rozpoczęcia transakcji sprzedaży kodu. * * Do redirectUrl i notifyUrl zostanie automatycznie doklejona zmienna code zawierająca wygenerowany kod * * @param string $redirectUrl * @param string $notifyUrl * @param float $amount * @param string $currency * @param string $ref * @return string */ public function getCodeUrl($redirectUrl, $notifyUrl, $amount, $currency = 'PLN', $ref = '') { $code = self::generateCode (); $title = 'Kod ' . $code . ' do serwisu ' . $this->sysId; $notifyUrl = self::fillUrl ( $notifyUrl ) . 'code=' . $code; $redirectUrl = self::fillUrl ( $redirectUrl ) . 'code=' . $code; return $this->getTransactionUrl ( $ref, $amount, $currency, $title, $notifyUrl, $redirectUrl ); } /** * Uzupełnia adres URL tak, by doklejki (sygnatury, parametry) nie niszczyły formatu * * @param string $url * @return string */ $url .= '?'; } else { $url .= '&'; } return $url; } /** * Pobranie URL rozpoczęcia transakcji. * Wysłanie klienta pod wskazany * adres URL zainicjuje transakcję. * * @param string $ref * - kod referencyjny programu partnerskiego. Dla serwisów nie uczestniczących w programie partnerskim należy pozostawić pusty. * @param float $amount * - cena kodu * @param string $currency * - waluta. Dla złotówki: PLN. * @param string $title * - tytuł transakcji. Powinien zawierać sprzedawany kod, np. "Kod ASDFQW dla serwisu www.przykład.pl" * @param string $notifyUrl * - adres URL na który system Cashbill prześle powiadomienie o dokonaniu transakcji. Powinien zawierać parametry wystarczające do identyfikacji konkretnego kodu ( Przykładowy skrypt odbiorczy w pliku cashbillExampleConfirmation.php ). * @param string $redirectUrl * - adres URL na który zostanie przekierowany klient po zakupie kodu. Może zawierać w parametrach kod, co w połączeniu z odpowiednią konstrukcją strony, umożliwi zwolnienie klienta z konieczności ręcznego przepisania kodu do formularza. */ public function getTransactionUrl($ref, $amount, $currency, $title, $notifyUrl, $redirectUrl) { // uzuełnienie notifyUrl, by sygnatura nie uszkodziła adresu $notifyUrl = self::fillUrl ( $notifyUrl ); $sign = md5 ( $this->sysId . $ref . $amount . $currency . $title . $notifyUrl . 'bounce-signed' . $redirectUrl . $this->secret ); 'sysid' => $this->sysId, 'ref' => $ref, 'encoding' => $this->encoding, 'amount' => $amount, 'currency' => $currency, 'notifyUrl' => $notifyUrl, 'notifyMode' => 'bounce-signed', 'redirectUrl' => $redirectUrl, 'title' => $title, 'sign' => $sign ); $url = self::CASHBILL_URL . 'pay/get/?'; foreach ( $data as $key => $value ) { } return $url; } protected function checkSignature($queryString) { } /** * Sprawdza, czy aktualne żądanie zawiera poprawną sygnaturę * systemu Cashbill. * * @return boolean */ public function checkNotifyRequest() { return $this->checkSignature ( $_SERVER ['QUERY_STRING'] ); } /** * Informuje system Cashbill o przyjęciu potwierdzenia płatności. */ public function notifySuccess() { } /** * Informuje system Cashbill o błędzie przy przyjmowaniu potwierdzenia płatności. * * @param string $error */ public function notifyError($error) { } }
cashbillInit.php:
<?php require '../cashbillCode.php'; /** * @TODO: uzupełnić sysid i privkey serwisu odczytany z panelu administracyjnego CashBill */ $cashbill = new cCashbillCode ( 'sysID', 'keyId' );
casbillPaycodeConfirmation.php:
<?php require 'cashbillInit.php'; if ($cashbill->checkNotifyRequest ()) { $code = $_GET ['code']; /* * @TODO: W tym miejscu należa aktywować kod $code */ $cashbill->notifySuccess (); } else { $cashbill->notifyError ( 'Brak autoryzacji potwierdzenia' ); }
cashbillPaycodeTransaction.php:
<?php require 'cashbillInit.php'; $baseUrl = 'http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['REQUEST_URI']).'/'; // w produkcyjnym środowisku proszę ustawić stały adres URL $url = $cashbill->getCodeUrl( $baseUrl.'cashbillPaycodeReturn.php', // $redirectUrl - adres, na który wróci klient po dokonaniu zakupu $baseUrl.'cashbillPaycodeConfirmation.php', // $notifyUrl - adres, na który zostanie wysłane podpisane potwierdzenie transakcji 9.99 // $amount - kwota transakcji (domyślnie w PLN) );
cashbillPaycodeReturn.php:
<?php $code = $_GET ['code'];