PHP

PHP汇聚支付-小程序

这两天对接了一个第三方支付汇聚支付,跟之前对接的易宝支付一样都踩坑不少,不过这两种支付都是类似的。

官方的sdk貌似没什么用,因为我不会用。

请求加密验签有两种方式:

  • md5(商户号和md5秘钥)
  • rsa(商户号,平台公钥和商户秘钥)

非常果断的放弃了rsa...

下面是发起请求的代码,绝对看得懂,肯定能让你少走弯路:

$join_pay_config = [
    'mch_id' => '', //商户号
    'secret' => '', //商户秘钥
    'mch_no' => '' //报备商户号
];

$mini_app_config = [
    'app_id' => '' 
];

$params["p0_Version"] = "1.0"; //版本 1.0 就行
$params["p1_MerchantNo"] = $join_pay_config['mch_id']; //商户号
$params["p2_OrderNo"] = '202006304585412'; //订单号
$params["p3_Amount"] = "12.00"; //订单金额
$params["p4_Cur"] = "1"; //交易货币 1 人民币
$params["p5_ProductName"] = '测试商品';
$params["p6_ProductDesc"] = '测试商品描述';
$params["p9_NotifyUrl"] = 'https://'.$_SERVER['HTTP_HOST'].'/api/Index/order_notify'; //回调地址
$params["q1_FrpCode"] = "WEIXIN_XCX"; //交易类型 这个是小程序
$params["q5_OpenId"] = $user['openid']; //openid
$params["q7_AppId"] = $mini_app_config['app_id']; //小程序appid
$params['qa_TradeMerchantNo'] = $join_pay_config['mch_no']; //报备商户号

$hmacVal = urlencode(hmacRequest($params, $join_pay_config['secret']));
$params['hmac'] = $hmacVal;

//curl用 POST
$result = app_curl("https://www.joinpay.com/trade/uniPayApi.action", $params);

//返回码 100 是成功
if ($result['ra_Code'] != 100) {
    api_json_return(500, $result['rb_CodeMsg']);
}

return api_json_return(0, 'success', json_decode($result['rc_Result'], true));

支付回调

//好像没什么好写的,无非就是验签,然后进行订单一些列操作
- r1_MerchantNo //商户号
- r2_OrderNo //订单号
- r3_Amount //订单金额
- r6_Status //支付状态 100 成功
- hmac //签名数据

//最后要返回一个小写字符串 `success`

退款

//支付配置
$join_pay_config = Config::get('join_pay');

//生成一个退款号
$refund_no = cmf_get_order_sn();

// 商户编号
$params["p1_MerchantNo"] = $join_pay_config['mch_id'];
// 商户原订单号
$params["p2_OrderNo"] = $this->order['order_sn'];
// 商户退款订单号
$params["p3_RefundOrderNo"] = $refund_no;
// 退款金额
$params["p4_RefundAmount"] = $this->order['price'];
// 退款原因描述
$params["p5_RefundReason"] = '退款原因';
// 异步通知地址(收到异步通知后,返回一个小写字符串`success`)
$params["p6_NotifyUrl"] = 'https://'.$_SERVER['HTTP_HOST'].'/api/Index/refund_notify';
// 加密签名
$hmacVal = urlencode(hmacRequest($params, $join_pay_config['secret']));
$params['hmac'] = $hmacVal;

$result = app_curl("https://www.joinpay.com/trade/refund.action", $params);

//另外会有退款异步回调,这里直接简单判断退款成功了,没有根据异步回调来操作业务逻辑
if ($result['ra_Status'] == 100) {
    //更新订单状态
    OrderModel::where(['id'=>$this->order['id']])->update(['status'=>4,'refund_code'=>$refund_no]);
}

用到的方法

//生成签名
function hmacRequest($params, $key, $encryptType = "1")
{
    if ("1" == $encryptType) {
        return md5(implode("", $params) . $key);
    } else {
        $private_key = openssl_pkey_get_private($key);
        $params = implode("", $params);
        openssl_sign($params, $sign, $private_key, OPENSSL_ALGO_MD5);
        openssl_free_key($private_key);
        $sign = base64_encode($sign);
        return $sign;
    }

}

这里只是一个简单的示例,更详细的需要阅读官方的文档,根据自己的需求业务编写更安全更效的代码

类似文章