海外支付RolePay对接
海外支付RolePay对接
技术分享
2020-04-15 09:25:35
618次阅读
接口地址:mpay.royalpay.com.au/docs/cn/
RolePay只接受人民币和澳元两个币种的支付订单:AUG-澳元,CNY-人民币。所有和金额相关的数字均以货币最小面值为单位,以AUD为例,100表示AUD 1.00。
RolePay支持项目种类(现有市面上的大部分支付途径都是支持的):1、微信QrCode2、微信JsAPI3、微信小程序接入微信小程序需完成海外主体认证,并且认证主体需要与在RoyalPay开通的商户主体一致4、支付宝QrCode5、支付宝H56、支付宝JsApi7、线下支付订单包含收银终端和QrCode两种,支持支付宝和微信线下QRCode支付用于对接无扫码设备的收银终端,下单后得到二维码地址,自行生成二维码图片后展示在收银终端屏幕上,并由用户使用对应支付客户端进行扫码支付。8、京东Web订单用于PC端京东支付,创建订单后跳转到返回的pay_url(需附加签名参数和redirect参数),随后进入京东支付页面完成支付 该接口仅现仅支持京东支付。9、汇付Web订单用于PC端汇付通支付,创建订单后跳转到返回的pay_url,随后进入汇付通支付页面完成支付 该接口仅现仅支持汇付通支付。
小程序代码参考:
<?php /** * 发起支付调用类 * Class RoyalPay */ class RoyalPay { /** * 海外支付 * RoyalPay constructor. * @param $openid * @param $money * @param $order_number * @param string $description * @param string $notify_url */ public function royalPay($openid, $money, $order_number, $description = '订单', $notify_url = '') { $wx_config = [ 'appid' => '' //小程序APPID ]; $partner_code = \wx\lib\RoyalPayConfig::PARTNER_CODE; //必填,商户编码,由4位大写字母或数字构成 $credential_code = \wx\lib\RoyalPayConfig::CREDENTIAL_CODE;//系统为商户分配的开发校验码 $time = $this->msectime(); $json_data = [ 'description' => $description, //必填,订单标题(最大长度128字符,超出自动截取) 'price' => $money * 100,//必填,金额,单位为货币最小单位,例如使用100表示AUD1.00 'currency' => 'AUD',//币种代码 默认值: AUD 允许值: AUD, CNY 'notify_url' => $notify_url,//支付通知url,详见支付通知api,不填则不会推送支付通知 'operator' => '', //操作人员标识 'appid' => $wx_config['appid'],//小程序appid 'customer_id' => $openid,//小程序openid ]; $nonce_str = $this->wxCreateNonceStr(24); $sign = strtolower(hash('sha256', $partner_code . '&' . $time . '&' . $nonce_str . '&' . $credential_code, false)); $url = 'https://mpay.royalpay.com.au/api/v1.0/gateway/partners/' . $partner_code . '/microapp_orders/' . $order_number . '?time=' . $time . '&nonce_str=' . $nonce_str . '&sign=' . $sign; $result = $this->curl_put($url, $json_data); if ($result['return_code'] != 'SUCCESS') { return sendArray($result, $result['return_code'], $result['return_msg']); } // ["partner_order_id"] => string(20) "MO201903261533033482" //商户订单ID // ["full_name"] => string(18) "COURSECUBE PTY LTD" //商户注册全名 // ["partner_name"] => string(10) "CourseCube" //商户名称 // ["channel"] => string(6) "Wechat" 支付渠道 Alipay|支付宝、Wechat|微信、Bestpay|翼支付 // ["sdk_params"] => array(6) { //小程序支付所需参数(Json字符串) // ["timeStamp"] => string(10) "1553585585" // ["package"] => string(46) "prepay_id=wx261533051265542be3aed3e42896290556" // ["paySign"] => string(32) "D56CB67BEE3D03D39E2906C5FDEBED80" // ["appId"] => string(18) "wxddd0b735201c1bd2" // ["signType"] => string(3) "MD5" // ["nonceStr"] => string(30) "WIqnDBWGvcAa2er6xsMEevCwbMeITS" // } // ["result_code"] => string(7) "SUCCESS" //SUCCESS表示创建订单成功,EXISTS表示订单已存在 // ["partner_code"] => string(4) "CCC1" //商户编码 // ["order_id"] => string(32) "CCC1-20190326173304752-8WBFCYDN0" //RoyalPay订单ID,同时也是微信订单ID,最终支付成功的订单ID可能不同 // ["return_code"] => string(7) "SUCCESS" //执行结果 if ($result['result_code'] == 'EXISTS') { return sendArray($result, $result['result_code'], '订单已存在'); } return sendArray($result); } private function curl_put($url, $data) { $data = json_encode($data); $ch = curl_init(); //初始化CURL句柄 curl_setopt($ch, CURLOPT_URL, $url); //设置请求的URL curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json;Accept:application/json')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //设为TRUE把curl_exec()结果转化为字串,而不是直接输出 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); //设置请求方式 curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//设置提交的字符串 $output = curl_exec($ch); if (curl_error($ch)) { return ['return_code' => 'curl error', 'return_msg' => curl_error($ch)]; } curl_close($ch); return json_decode($output, true); } /** * 随机字符串生成 * @param int $length * @return string */ private function wxCreateNonceStr($length = 16) { $string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $result = ""; for ($i = 0; $i < $length; $i++) { $result .= substr($string, mt_rand(0, strlen($string) - 1), 1); } return $result; } /** * 获取毫秒级别时间戳 * @return float */ private function msectime() { list($msec, $sec) = explode(' ', microtime()); return (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000); } } /** * 支付回调处理 * Class RoyalPayNotifyHandel */ class RoyalPayNotifyHandel { /** * 海外支付回调 * @throws \think\exception\PDOException */ public function indepNotify() { $uid = input('param.uid', 2); // $response = json_decode($GLOBALS['HTTP_RAW_POST_DATA'], true); $response = json_decode(file_get_contents('php://input'), true); $input = new \wx\lib\RoyalPayDataBase(); $input->setNonceStr($response['nonce_str']); $input->setTime($response['time']); $input->setSign(); if ($input->getSign() == $response['sign']) { //验证成功(Validate success) //商户订单号(order id of the merchant) $order_id = $response['partner_order_id']; //RoyalPay订单号 (order id of Royalpay) $royal_order_id = $response['order_id']; //订单金额,单位是最小货币单位(order ammount,the unit is cents) $order_amt = $response['total_fee']; //支付金额,单位是最小货币单位(pay ammount,the unit is cents) $pay_amt = $response['real_fee']; //币种(Currency) $currency = $response['currency']; //订单创建时间,格式为'yyyy-MM-dd HH:mm:ss',澳洲东部时间(Order creation time in the format yyyy-MM-dd HH: mm: ss', Eastern Australia) $create_time = $response['create_time']; //订单支付时间,格式为'yyyy-MM-dd HH:mm:ss',澳洲东部时间(Order payment time in the format yyyy-MM-dd HH: mm: ss', Eastern Australia) $pay_time = $response['pay_time']; // todo 业务处理 $result = array('return_code' => 'SUCCESS'); echo json_encode($result); } else {////验证失败(Validate failed) echo "fail"; } } }
相关推荐
近期发布
-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10