migs(万事达卡虚拟支付客户端)集成php


migs (MasterCard Virtual Payment Client) integration php

可以帮助我关于如何集成migs(万事达虚拟支付客户端)在一个php网站!

我已经阅读了参考指南,但它没有帮助!

//提交给MIGS PAYMENT GATEWAY的值

        $SECURE_SECRET =  $signature; //value from migs payment gateway
        $accessCode    =  $accesscode;//value from migs payment gateway
        $merchantId    =  $merchantid;//value from migs payment gateway
        $paymentdata = array(
                 "vpc_AccessCode" => $accessCode,
                 "vpc_Amount" => ($amount*100),//our product price , must multipy by 100
                 "vpc_Command" => 'pay',
                 "vpc_Locale" => 'en',// order id
                 "vpc_MerchTxnRef" => random_unique_value(like session),
                 "vpc_Merchant" => $merchantId,
                 "vpc_OrderInfo" => "Some Comment",
                 "vpc_ReturnURL" => "htps://yoursite.com/returnpoint",//here code for db updation, return variable here
                 "vpc_Version" => '1'
                           );
        $actionurl = 'https://migs.mastercard.com.au/vpcpay' . "?";
        $HashData = $SECURE_SECRET;
        $str = 0;
        foreach ($paymentdata as $key => $value) {
            // create the md5 input and URL
            if (strlen($value) > 0) {
                // this ensures the first paramter of the URL is preceded by the '?' char
                if ($appendAmp == 0) {
                    $actionurl .= urlencode($key) . '=' . urlencode($value);
                    $str = 1;
                } else {
                    $actionurl .= '&' . urlencode($key) . "=" . urlencode($value);
                }
                $HashData .= $value;
            }
        }
        if (strlen($SECURE_SECRET) > 0){$actionurl .= "&vpc_SecureHash=" . strtoupper(md5($HashData));}
        header("Location: " . $actionurl);
    }

/////////////////////返回值/////////////////////////////////

the return url will be like
https://yoursite.com/returnpoint?vpc_TransactionNo="migs_transaction_number"&vpc_MerchTxnRef="random_unique_value(we post to migs)"&vpc_TxnResponseCode=value&vpc_Message="value"
 if vpc_TxnResponseCode = 0 -- success ,vpc_Message = approved -- paymet is success , All other unsuccessfull payment

实现migs支付网关,我们需要在其中发布一些详细信息到https://migs.mastercard.com.au/vpcpay?这个url包含以下数据

    /*"vpc_AccessCode" the accesscode given by Migs
"vpc_Amount" Amount that is multiplied by 100
"vpc_Command" ='pay',default pay
"vpc_Locale" = 'en' // language
"vpc_MerchTxnRef"  orderId // Should be Unique for each payment
"vpc_Merchant"  // merchant ID
"vpc_OrderInfo"  // Desc or and details of Product
"vpc_ReturnURL" // SuccessUrl
"vpc_Version" = '1'
&vpc_SecureHash = // create MD5 of all the values that are passed  */

创建Url
    $SECURE_SECRET = "YEOCOEN29B0785F1FF1E3C0FA8A3FUJK";  
        $accessCode = '546484645';
        $merchantId = '5465465288';
        if($migs_testmode ==1) {
            $SECURE_SECRET = "YEOCOEN29B0785F1FF1E3C0FA8A3FUJK";
            $accessCode = '98989645';
            $merchantId = '56456456489';
        }
     $amount ='10.00';
    $unique_id = rand(999999,8988888888);//this is a sample random no
        $postdata = array(
                "vpc_AccessCode" => $accessCode,
                "vpc_Amount" => ($amount*100),
                "vpc_Command" => 'pay',
                "vpc_Locale" => 'en',
                "vpc_MerchTxnRef" => $unique_id,
                "vpc_Merchant" => $merchantId,
                "vpc_OrderInfo" => 'this is a product',
                "vpc_ReturnURL" => "https://mywebsite.com/success.php",
                "vpc_Version" => '1');

        $vpcURL = 'https://migs.mastercard.com.au/vpcpay?';
        $md5Hash = $SECURE_SECRET;
        $appendAmp = 0;

        foreach ($wpay_postdata as $key => $value) {
            if (strlen($value) > 0) {
                if ($appendAmp == 0) {
                    $vpcURL .= urlencode($key) . '=' . urlencode($value);
                    $appendAmp = 1;
                } else {
                    $vpcURL .= '&' . urlencode($key) . "=" . urlencode($value);
                }
                $md5Hash .= $value;
            }
        }
        if (strlen($SECURE_SECRET) > 0) {
            $vpcURL .= "&vpc_SecureHash=" . strtoupper(md5($md5Hash));
        }
        header("Location: " . $vpcURL)

查看详细结果

您可以使用Omnipay PHP库,它支持MIGS网关。

一个场外支付处理(三方)的示例如下:

use Omnipay'Omnipay;
$gateway = Omnipay::create('Migs_ThreeParty');
$gateway->setMerchantId('foo');
$gateway->setMerchantAccessCode('foo');
$gateway->setSecureHash('foo');
$response = $gateway->purchase(array('amount' => '10.00', 'currency' => 'AUD'))->send();
if ($response->isRedirect()) {
    // redirect to offsite payment gateway
    $response->redirect();
} else {
    // payment failed: display message to customer
    echo $response->getMessage();
}

我尝试在python django中集成MIGS万事达。我遇到了很多问题。以下是我将MIGS与我的web应用程序集成的经验。我使用VPC集成参考3.1.21.1

  1. 在实现Mode1 VPC时:我收到了400个错误请求。这要归功于我案子的安全哈希码。

  2. 如果用户发送错误的字段名称或未排序的顺序,则会发生此错误。
  3. 一旦我解决了Mode1错误,我使用外部支付选择(EPS),其中我发送VPC_card和VPC_gateway附加字段与Mode1 VPC参数。我收到了400个坏请求。因此,经过与MIGS支持团队的长时间讨论。我们通过将vpc_card更改为vpc_card和vpc_Gateway来解决这个问题。这是文件错误。

  4. 一旦我能够绕过卡片类型页面。我尝试完成模式2 VPC实现。所以,在这种情况下,我添加了vpc_CardNum,vpc_vpc_CardExp,vpc_CardSecurityCode附加字段与上述点请求。我发送GET请求。但没有成功。对于卡片详细信息或模式2,我们必须使用POST请求。

  5. 对于mode2 VPC,我们应该使用HTTPS而不是HTTP的POST请求。自签名证书就可以了。所以,我发送HTTPS POST请求与额外的参数,但它仍然没有工作,我得到403禁止错误。因为,ajax调用的Content-type是application/json。所以在使用默认的POST内容类型之后。它工作得很好。

在Migs. config.app中,我添加了与Migs无关的系统变量。所以用户可以忽略它
import hashlib
import urllib, urllib2
from migs.config.app_config import *

'''
This method is for sorting the fields and creating an MD5 secure hash.
@param fields is a map of all the incoming hey-value pairs from the VPC
@param buf is the hash being returned for comparison to the incoming hash
'''

class MigsClient(object):
def __init__(self, secure_token, vpc_url, server_name):
    self.secure_secret  = secure_token
    self.vpcURL = vpc_url
    self.server_name = server_name    
def hash_all_fields(self,fields):
    buf = ""
    # create a list and sort it
    fieldNames = fields.keys();
    fieldNames.sort()
    # create a buffer for the md5 input and add the secure secret first
    buf = buf + self.secure_secret
    for key in fieldNames:
        print key,fields[key]
        buf = buf + fields[key] 
    # iterate through the list and add the remaining field values
    # create the md5 hash and UTF-8 encode it
    try:
        m = hashlib.md5()
        m.update(buf)
        ba = m.hexdigest()
        ba = ba.upper()
        return ba
    except Exception,e:
        import traceback 
        traceback.print_exc()

def setup(self, fields,additional_fields=None):
    #The Page does a redirect to the Virtual Payment Client
    #retrieve all the parameters into a hash map
    # no need to send the vpc url, EnableAVSdata and submit button to the vpc
    '''
    Retrieve the order page URL from the incoming order page and add it to 
    the hash map. This is only here to give the user the easy ability to go 
    back to the Order page. This would not be required in a production system
    NB. Other merchant application fields can be added in the same manner
    '''
    '''
    Create MD5 secure hash and insert it into the hash map if it was created
    created. Remember if self.secure_secret = "" it will not be created
    '''
    if self.secure_secret:
        secureHash = self.hash_all_fields(fields);
        fields["vpc_SecureHash"] = secureHash;
    # Create a redirection URL
    buf = self.vpcURL+'?';
    if not additional_fields:
        buf  = buf + urllib.urlencode(fields)
    else:
        buf  = buf + urllib.urlencode(fields)+"&"+urllib.urlencode(additional_fields) 
    return buf
    #return fields["vpc_ReturnURL"], buf

def post_setup(self,fields, additional_fields=None):
    try:
        if self.secure_secret:
            secureHash = self.hash_all_fields(fields);
            fields["vpc_SecureHash"] = secureHash;
        return self.vpcURL,fields
    except:
        import traceback
        traceback.print_exc()

上面是示例代码,用户可以使用它来排序和创建Get请求和POST请求以及POST字典。