澳洲支付服务商RoyalPay微信支付宝APP支付对接

最近项目中需要开发澳洲那边的微信支付宝支付,所以去研究了一下微信境外支付,发现境外只支持服务商模式,即客户需要去与澳洲本地服务商合作,由客户提供材料,服务商帮客户申请支付相关账号,然后调用服务商提供的接口去获得调起支付所需的参数。客户选择了RoyalPay这家服务商,于是我照着服务商的提供的接口文档进行对接,实现了下单、查询订单状态、退款、查询退款状态接口。接口文档地址

<?php


namespace App\Components\AustraliaPay;


use App\Components\Common\DateTool;
use App\Components\Common\Utils;

class AustraliaPay
{

    /**
     * 支付接口
     *
     * by xh
     *
     * 2020/4/8 13:28
     * @param array $data  trade_no:订单号  price:订单金额   description:订单描述   currency:支付币种(只支持人民币与澳元) channel:支付通道(Wechat微信支付  Alipay支付宝支付)  notify_url:回调url
     * @return mixed
     */
    public static function payOrder(array $data){
        $data["appid"] = env('WECHAT_PAYMENT_APPID_HW');
        $sign_data = self::getSign();
        $url = "https://mpay.royalpay.com.au/api/v1.0/gateway/partners/".$sign_data['partner_code']."/app_orders/".$data['trade_no']."?time=".$sign_data['now_millisecond']."&nonce_str=".$sign_data['nonce_str']."&sign=".$sign_data['sign'];
        $response = self::put_curl($url,json_encode($data));
        Utils::processLog(__METHOD__,'测试支付----------------',json_encode($response));
        return json_decode($response);
    }

    /**
     * 查询订单状态
     *
     * by xh
     *
     * 2020/4/8 10:29
     * @param  $trade_no //商户订单号
     * @return mixed
     */
    public static function queryOrderStatus($trade_no){
        $sign_data = self::getSign();
        $url = "https://mpay.royalpay.com.au/api/v1.0/gateway/partners/".$sign_data['partner_code']."/orders/".$trade_no."?time=".$sign_data['now_millisecond']."&nonce_str=".$sign_data['nonce_str']."&sign=".$sign_data['sign'];
        $result = Utils::curl($url,false,0,1);
        return json_decode($result);
    }

    /**
     * 查询退款状态
     *
     * by xh
     *
     * 2020/4/8 10:29
     * @param  $trade_no //商户订单号
     * @return mixed
     */
    public static function queryRefundStatus($trade_no,$refund_trade_no){
        $sign_data = self::getSign();
        $url = "https://mpay.royalpay.com.au/api/v1.0/gateway/partners/".$sign_data['partner_code']."/orders/".$trade_no."/refunds/".$refund_trade_no."?time=".$sign_data['now_millisecond']."&nonce_str=".$sign_data['nonce_str']."&sign=".$sign_data['sign'];
        $result = Utils::curl($url,false,0,1);
        return json_decode($result);
    }

    /**
     * 申请退款
     *
     * by xh
     *
     * 2020/4/8 11:54
     * @param $trade_no  //订单单号
     * @param $refund_trade_no  //退款单号
     * @param $refund_fee //退款金额
     * @return mixed
     */
    public static function refund($trade_no,$refund_trade_no,$refund_fee){
        $sign_data = self::getSign();
        $url = "https://mpay.royalpay.com.au/api/v1.0/gateway/partners/".$sign_data['partner_code']."/orders/".$trade_no."/refunds/".$refund_trade_no."?time=".$sign_data['now_millisecond']."&nonce_str=".$sign_data['nonce_str']."&sign=".$sign_data['sign'];
        $result = self::put_curl($url,json_encode(['fee'=>$refund_fee]));
        return json_decode($result);
    }

    /**
     * 获取签名
     *
     * by xh
     *
     * 2020/4/7 18:01
     * @return array
     */
    public static function getSign(){
        $nonce_str = Utils::getRandomString(10);  //:随机字符串,无长度限制,请使用URL安全字符(避开&,=等符号),请注意HTTP URL的最大长度限制,建议长度在10到30位
        $partner_code = env('PARTNER_CODE');    //商户编码,由4位大写字母或数字构成
        $now_millisecond = DateTool::getMillisecond();  //当前毫秒,UTC毫秒时间戳,取当前UTC时间的毫秒数时间戳,Long类型,5分钟内有效
        $credential_code = env('CREDENTIAL_CODE');  //系统为商户分配的开发校验码,请妥善保管,不要在公开场合泄露
        //验证字符串
        $valid_string = $partner_code."&".$now_millisecond."&".$nonce_str."&".$credential_code;
        //签名算法 sha256加密验证字符串然后转成十六进制最后再转小写
        $sign = hash('sha256',$valid_string,false);
        $sign_data = [
            'nonce_str' => $nonce_str,
            'partner_code' => $partner_code,
            'now_millisecond' => $now_millisecond,
            'sign' => $sign
        ];
        return $sign_data;
    }

    /**
     * 发送put请求,传json参数
     *
     * by xh
     *
     * 2020/4/8 9:04
     * @param $url
     * @param $json_data
     * @return bool|string
     */
    public static function put_curl($url, $json_data)
    {
        $ch = curl_init();
        $header = array(
            'Content-Type: application/json; charset=utf-8',
            'Content-Length: ' . strlen($json_data)
        );//定义header,可以加多个
        curl_setopt($ch, CURLOPT_URL, $url); //定义请求地址
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); //定义请求类型,当然那个提交类型那一句就不需要了
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//定义header
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//定义是否直接输出返回流?
        curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data); //定义提交的数据
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 对认证证书来源的检查
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 从证书中检查SSL加密算法是否存在
        $res = curl_exec($ch);
        curl_close($ch);//关闭
        return $res;

    }

}

 

curl方法内容。日志类替换成你们自己用的日志类就行了

/**
     * 调取外部接口方法
     * @param $url 请求网址
     * @param bool $params 请求参数
     * @param int $ispost 请求方式
     * @param int $https https协议
     * @return bool|mixed
     */
    public static function curl($url, $params = false, $ispost = 0, $https = 0, $header = null)
    {
        Utils::processLog(__METHOD__, '', " " . "url:" . $url);
        $httpInfo = array();
        $ch = curl_init();

        //2019-10-07进行优化,可以设置header信息
        if ($header == null) {
            $header = array(
                'Content-Type: application/json; charset=utf-8'
            );
        }

        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36');
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        if ($https) {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // 对认证证书来源的检查
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); // 从证书中检查SSL加密算法是否存在
        }
        if ($ispost) {
            Utils::processLog(__METHOD__, "", "POST请求的params:" . json_encode($params));
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
            curl_setopt($ch, CURLOPT_URL, $url);
        } else {
            if ($params) {
                if (is_array($params)) {
                    $params = http_build_query($params);
                }
                curl_setopt($ch, CURLOPT_URL, $url . '?' . $params);
            } else {
                curl_setopt($ch, CURLOPT_URL, $url);
            }
        }

        $response = curl_exec($ch);

        if ($response === FALSE) {
            //echo "cURL Error: " . curl_error($ch);
            return false;
        }
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $httpInfo = array_merge($httpInfo, curl_getinfo($ch));
        curl_close($ch);
        return $response;
    }

 

调用下单接口

//进行业务测试
public function test()
{
    $pay_data = [
        'trade_no' => $trade_no = Utils::generateTradeNo(),        //订单号
        'price' => 100,                 //支付金额,单位为分
        'description'=>'1澳元支付成功',  //订单描述
        'currency' => 'AUD',            //货币种类
        'notify_url' => ''http://xxx.com/payNotify'',    //支付回调
        'channel' => 'Wechat'           //支付通道  Wechat:微信支付   Alipay:支付宝支付
    ];
    $result = AustraliaPay::payOrder($pay_data)->sdk_params;
    return ApiResponse::makeResponse(true,bcmul(1.11,100),ApiResponse::SUCCESS_CODE);
}

 

下单接口返回内容

微信

支付宝

posted @ 2020-05-11 17:13  _徐辉  阅读(913)  评论(0编辑  收藏  举报