نمونه کد NET.

  • بروزشده : 9 آذر 1399

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Net.Http.Headers;

public class PackpayGatewayHandler
{

public const string PackpayBaseUrl = "https://dashboard.packpay.ir/";
public string SecretId { get; set; }
public string RefreshToken { get; set; }
public string ClientId { get; set; }
private string _token;

public static void Main()
{

//fill your info
//بعد از ساختن کلاس، داده های مربوطه را در فیلد های کلاس قرار دهید. این مقادیر را از پنل خود میتوان دریافت نمود
PackpayGatewayHandler packpayGatewayHandler = new PackpayGatewayHandler();
packpayGatewayHandler.SecretId = "??";
packpayGatewayHandler.ClientId = "??";
packpayGatewayHandler.RefreshToken = "??";
//این متود درخواست شما را جهت اتصال به درگاه پرداخت ارسال میکند. ورودی اول قیمت به ریال و ورودی دوم آدرس بازگشت سایت است
//آدرس بازگشت سایت باید مطابق با آدرسی باشد که سرویس را بر اساس آن ساخته اید در صورتی که آدرس کال بک مطابق زیر باشد، آدرسی که از پکپی برای جواب به سمت شما می آید مطابق زیر است
var sendToBankResponse = packpayGatewayHandler.SendToBank(50000, "https://example.com/");
//callbackurl : https://example.com/?reference_code=1559209589

Console.WriteLine(sendToBankResponse.Message + " " + sendToBankResponse.Status + " " + sendToBankResponse.ReferenceCode);
//بعد از صدا زدن متود بررسی کنید که عملیات با موفقیت انجام شده یا خیر اگر نتیحه برابر صفر بود، عملیات موفقیت آمیز بوده
if (sendToBankResponse.Status != "0")
{
//return error
Console.WriteLine(sendToBankResponse.Message);
return;
}
//بعد از دریافت جواب از سمت بانک کاربر را به آدرس زیر همراه با کد رفرنس دریافت شده هدایت کنید
//after receiving response from send to banck redirect to
//https://dashboard.packpay.ir/bank/purchase/send?RefId=${sendToBankResponse.ReferenceCode}

//confirm
//در این مرحله پس از دریافت جواب از سمت بانک از این متود برای "تایید تراکنش استفاده کنید". دقت داشته باشید در صورت عدم، تایید پول به حساب مشتری بر میگردد
//از کد پیگیری ای که سمت شما آمده است برای تایید استفاده کنید
var resultConfirm = packpayGatewayHandler.ConfirmCallback("101606415284");
Console.WriteLine(resultConfirm.Message + " " + resultConfirm.Status + " " + resultConfirm.ReferenceCode);
//دقت داشته باشید فقط در صورتی عملیات موفقیت آمیز است که مقدار وضعیت نتیجه برابر صفر باشد. در این صورت میتوانید پیام مناسب را به کاربر نشان دهید و در غیر این صورت خطای مربوطه را هندل کنید
if (resultConfirm.Status != "0")
{
//return error
Console.WriteLine(resultConfirm.Message);
return;
}

}

public PackpayResponse SendToBank(int price, string callBackUrl)
{

_refreshToken();
var body = new Dictionary<string, string>()
{
{"access_token", _token},
{"amount", price.ToString()},
{"callback_url", callBackUrl},
{"verify_on_request", "true"}

};
var path = "developers/bank/api/v2/purchase?" + _queryBuilder(body);

var result = _request("POST", path, null);
return _generatePackpayResponse(result);

}

public PackpayResponse ConfirmCallback(string referenceCode)
{

_refreshToken();
var body = new Dictionary<string, string>()
{

{"access_token", _token},
{"reference_code", referenceCode}

};
var path = "developers/bank/api/v2/purchase/verify?" + _queryBuilder(body);

var result = _request("POST", path, null);
return _generatePackpayResponse(result);

}

private Dictionary<string, dynamic> _request(string method, string path, Dictionary<string, string> body)
{

using (var client = new HttpClient())
{

var byteArray = Encoding.ASCII.GetBytes(ClientId + ":" + SecretId);
var header = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
client.DefaultRequestHeaders.Authorization = header;
client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/json; charset=utf-8");
HttpResponseMessage response;
if (method == "POST")
{
string json = JsonConvert.SerializeObject(body, Formatting.Indented);
var httpContent = new StringContent(json);
response = client.PostAsync(PackpayBaseUrl + path, httpContent).Result;
}
else
{
response = client.GetAsync(path).Result;
}
var result = response.Content.ReadAsStringAsync().Result;
var values = JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(result);
return values;

}

}

private void _refreshToken()
{

string path = "oauth/token?grant_type=refresh_token&refresh_token=" + RefreshToken;
var result = _request("POST", path, null);
_token = result["access_token"];

}

private string _queryBuilder(Dictionary<string, string> body)
{

var first = true;
StringBuilder sb = new StringBuilder();
foreach (var item in body)
{

if (first)
first = false;
else
sb.Append('&');
sb.Append(item.Key);
sb.Append('=');
sb.Append(item.Value.ToString());

}
return sb.ToString();

}

private PackpayResponse _generatePackpayResponse(Dictionary<string, dynamic> packpayDict)
{

PackpayResponse packpayResponse = new PackpayResponse();
packpayResponse.Status = packpayDict["status"];
packpayResponse.Message = packpayDict["message"];
dynamic referenceCode;
packpayDict.TryGetValue("reference_code", out referenceCode);
packpayResponse.ReferenceCode = referenceCode;
return packpayResponse;

}

}
public class PackpayResponse
{

public string Status { get; set; }
public string Message { get; set; }
public string ReferenceCode { get; set; }

}