第三方支付HKPay接口对接过程要点总结

2023-11-17 14:00:38 浏览数 (1)

前言

HKPay是中国香港的一条支付通道,可用于外贸独立站做境外电商收款。

核心函数

所有支付通道的对接流程,几乎都是一样的。一般都是组织参数、签名、提交然后处理返回结果。然后跳转到收银页面,等待用户支付。用户支付后,返回网站。同时异步接口接收结果通知并处理。

字符串拼接函数

计算md5签名之前,用到的字符串拼接函数。

代码语言:javascript复制
                //拼接字符串
                public function param_ck_null($kq_va,$kq_na)
                {
                        if($kq_va == ""){
                                $kq_va="";
                        }else{
                                return $kq_va=$kq_na.'='.$kq_va.'&';
                        }
                }

数据提交函数

采用post/json提交方式

代码语言:javascript复制
                //提交数据到上游接口函数
                public function send_post_request($url, $body, $headers, $method)
                {
                        $curl = curl_init();

                        curl_setopt_array($curl, array(
                            CURLOPT_URL => $url,
                            CURLOPT_RETURNTRANSFER => true,
                            CURLOPT_ENCODING => '',
                            CURLOPT_MAXREDIRS => 10,
                            CURLOPT_TIMEOUT => 0,
                            CURLOPT_FOLLOWLOCATION => true,
                            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
                            CURLOPT_CUSTOMREQUEST => $method,
                            CURLOPT_POSTFIELDS => json_encode($body),
                            CURLOPT_HTTPHEADER => $headers,
                        ));

                        $response = curl_exec($curl);

                        curl_close($curl);

                        return $response;
                }

获取订单结果url

用户支付之后,不管成功还是失败都需要跳转回到网站。此函数用于获取返回网站需要的网址。

代码语言:javascript复制
                //获取订单结果url
                public function get_order_checkout_url($orderid)
                {
                        //完成支付url
                        $rurl = WC()->api_request_url( 'wc_hkpay_return' ) ;
                        $check = strpos($rurl, '?');
                        if ( $check !== false) {
                                $rurl = $rurl . "&mref=" . $orderid;
                        } else {
                                $rurl = $rurl . "?mref=" . $orderid;
                        }

                        return $rurl;
                }

展示支付二维码

返回的是二维码数据,需要在网站上展示

代码语言:javascript复制
                function generate_form($order_id)
                {
                        $html_str = '';
                        global $wpdb;
                        $order = wc_get_order($order_id);

                        //url查询
                        $check_query = $wpdb->get_results("SELECT ref,paydata,paytype FROM {$wpdb->prefix}hkpay_data WHERE orderid = '".addslashes($order_id)."' order by id desc", ARRAY_A);
                        $check_query_count = count($check_query);
                        if($check_query_count >= 1){
                                $mref = $check_query[0]['ref'];
                                $paydata = $check_query[0]['paydata'];
                                $paytype = $check_query[0]['paytype'];

                                $completed_url = $this->get_order_checkout_url($mref);

                                if ($paytype ==='800201') {
                                         $html_str =  'Scan the QR code to complete the payment'.
                                                ''.
                                                ''.
                                                ''.
                                                ''.
                                                        ''.__('Pay Completed', 'uepay-for-woocommerce').''.
                                                        ''.__('Cancel', 'uepay-for-woocommerce').''.
                                                '';

                                }
                        }

                        return $html_str;

                }

提交订单并处理返回

获取支付链接,并处理返回

代码语言:javascript复制
                        $response = $this->send_post_request($req_api, $Body, $Headers, 'POST');
                        $result = json_decode($response);

                        //打印结果
                        //error_log(__METHOD__ . PHP_EOL .print_r($result, true));
                        if ($result->code != 0 ) {
                                error_log(__METHOD__ . PHP_EOL . 'Code:' . $result->code . PHP_EOL. ' Error:' . $result->msg);
                                //抛出异常
                                throw new Exception("Unable to reach hkpay Payments (" . $result->msg . ")");
                        }

                        if ($result->code == 0 ) {
                                $OrderNo = $result->data->payOrderId;
                                $paydata = $result->data->payData;
                                #写入数据库
                                $query = "insert into {$wpdb->prefix}hkpay_data (ref, ordercode, orderid, total_cost, currency, paydata, paytype, order_state, timestamp)
                                values ('".$mref."', '".$OrderNo."','". $order_id . "',".$amount.",'". $currency_code."','". $paydata ."','".$payType."','I', now())";
                                $wpdb->query($query);

                                //跳转payurl
                                return array(
                                        'result' => 'success',
                                        'redirect'  => esc_url_raw(add_query_arg('order-pay', $order->get_id(), add_query_arg('key', $order->get_order_key(), wc_get_page_permalink( 'checkout' ))))
                                );
                        } else {
                                error_log(__METHOD__ . PHP_EOL . 'Code:' . $result->code . PHP_EOL. ' Error:' . $result->msg);
                                throw new Exception("Unable to redirect payurl (" . $result->msg . ")");
                        }

0 人点赞