1,目前市面上最为火爆的支付为,wechat以及alipay ,这两个支付想必大家都已经非常了解了。

下面我将对支付宝支付对接有比较详细的讲解

第一步,我们需要我支付权限包含的私钥,公钥,appid等等一系列权限,开发者工具里面查看





2,支付宝官方入口文件 Aopsdk


引入支付宝文件

引入后就可以直接在资金的paymentApi里面使用了,附上代码

vendor(\'Alipay.AopSdk\');
$aop = new \AopClient ();


3,请求支付,获取支付宝请求参数,调起支付。

支付宝官方给的demo

$aop = new AopClient ();

$aop->gatewayUrl = \'https://openapi.alipay.com/gateway.do\';

$aop->appId = \'your app_id\';$aop->rsaPrivateKey = \'请填写开发者私钥去头去尾去回车,一行字符串\';

$aop->alipayrsaPublicKey=\'请填写支付宝公钥,一行字符串\';

$aop->apiVersion = \'1.0\';

$aop->signType = \'RSA2\';

$aop->postCharset=\'GBK\';

$aop->format=\'json\';

$request = new AlipayTradeAppPayRequest ();


记得设置回调地址

$request->setNotifyUrl( C(\'ALIPAY_CONFIG.notify_url\'));

//商品参数

$request->setBizContent("{" ."\"timeout_express\":\"90m\"," ."\"total_amount\":\"9.00\"," ."\"seller_id\":\"2088102147948060\"," ."\"product_code\":\"QUICK_MSECURITY_PAY\"," ."\"body\":\"Iphone6 16G\"," ."\"subject\":\"大乐透\"," ."\"out_trade_no\":\"70501111111S001111119\"," ."\"time_expire\":\"2016-12-31 10:05\"," ."\"goods_type\":\"0\"," ."\"promo_params\":\"{\\\"storeIdType\\\":\\\"1\\\"}\"," ."\"passback_params\":\"merchantBizType%3d3C%26merchantBizNo%3d2016010101111\"," ."\"royalty_info\":{" ."\"royalty_type\":\"ROYALTY\"," ." \"royalty_detail_infos\":[{" ." \"serial_no\":1," ."\"trans_in_type\":\"userId\"," ."\"batch_no\":\"123\"," ."\"out_relation_id\":\"20131124001\"," ."\"trans_out_type\":\"userId\"," ."\"trans_out\":\"2088101126765726\"," ."\"trans_in\":\"2088101126708402\"," ."\"amount\":0.1," ."\"desc\":\"分账测试1\"," ."\"amount_percentage\":\"100\"" ." }]" ." }," ."\"extend_params\":{" ."\"sys_service_provider_id\":\"2088511833207846\"," ."\"hb_fq_num\":\"3\"," ."\"hb_fq_seller_percent\":\"100\"," ."\"industry_reflux_info\":\"{\\\\\\\"scene_code\\\\\\\":\\\\\\\"metro_tradeorder\\\\\\\",\\\\\\\"channel\\\\\\\":\\\\\\\"xxxx\\\\\\\",\\\\\\\"scene_data\\\\\\\":{\\\\\\\"asset_name\\\\\\\":\\\\\\\"ALIPAY\\\\\\\"}}\"," ."\"card_type\":\"S0JP0000\"" ." }," ."\"sub_merchant\":{" ."\"merchant_id\":\"19023454\"," ."\"merchant_type\":\"alipay: 支付宝分配的间连商户编号, merchant: 商户端的间连商户编号\"" ." }," ."\"enable_pay_channels\":\"pcredit,moneyFund,debitCardExpress\"," ."\"store_id\":\"NJ_001\"," ."\"specified_channel\":\"pcredit\"," ."\"disable_pay_channels\":\"pcredit,moneyFund,debitCardExpress\"," ."\"settle_info\":{" ." \"settle_detail_infos\":[{" ." \"trans_in_type\":\"cardSerialNo\"," ."\"trans_in\":\"A0001\"," ."\"summary_dimension\":\"A0001\"," ."\"amount\":0.1" ." }]" ." }," ."\"invoice_info\":{" ."\"key_info\":{" ."\"is_support_invoice\":true," ."\"invoice_merchant_name\":\"ABC|003\"," ."\"tax_num\":\"1464888883494\"" ." }," ."\"details\":\"[{\\\"code\\\":\\\"100294400\\\",\\\"name\\\":\\\"服饰\\\",\\\"num\\\":\\\"2\\\",\\\"sumPrice\\\":\\\"200.00\\\",\\\"taxRate\\\":\\\"6%\\\"}]\"" ." }," ."\"ext_user_info\":{" ."\"name\":\"李明\"," ."\"mobile\":\"16587658765\"," ."\"cert_type\":\"IDENTITY_CARD\"," ."\"cert_no\":\"362334768769238881\"," ."\"min_age\":\"18\"," ."\"fix_buyer\":\"F\"," ."\"need_check_info\":\"F\"" ." }," ."\"business_params\":\"{\\\"data\\\":\\\"123\\\"}\"" ." }");

//附上对商品参数的封装与解释

$payData = [
    \'body\' => $order[\'body\'],
    \'subject\' => $order[\'detail\'],
    \'order_no\' => $order[\'out_trade_no\'],
    \'timeout_express\' => time() + 600,// 表示必须 600s 内付款
    \'amount\' => $order[\'total_fee\'],// 单位为元 ,最小为0.01
    \'return_param\' => $order[\'out_trade_no\'],// 一定不要传入汉字,只能是 字母 数字组合
    // \'client_ip\' => isset($_SERVER[\'REMOTE_ADDR\']) ? $_SERVER[\'REMOTE_ADDR\'] : \'127.0.0.1\',// 客户地址
    \'goods_type\' => $order[\'trade_type\'],//订单类型\',
    \'store_id\' => \'\',
];

$result = $aop->pageExecute ( $request);

返回结果:


这便是生成的支付宝请求参数,给到客户端那边,即可客户端会拿到商品请求数据请求,支付宝,调起支付。

$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";

$resultCode = $result->$responseNode->code;if(!empty($resultCode)&&$resultCode == 10000){echo "成功";} else {echo "失败";}


3,异步回调,获取结果

根据你给的回调地址,支付会一直请求,直到你返回Success

附上代码:


/**
 *支付宝通知
 * @author fancy
 */
public function alipayNotify()
{
    Log::writeJmqNoticeLog(\'notify_begin\', ErrorCode::ALIPAY_NOTIFY_SUC, __FILE__, __LINE__);
    vendor(\'Alipay.AopSdk\');
    $aop = new \AopClient();
    $aop->alipayrsaPublicKey = C(\'ALIPAY_CONFIG.alipayrsaPublicKey\');
    $aop->rsaCheckV1($_POST, null, "RSA2");
    if ($_POST[\'trade_status\'] == \'TRADE_SUCCESS\') {
        $order_sn = I(\'post.out_trade_no\');
        Log::writeJmqNoticeLog(\'alipay_notify\' . $order_sn, ErrorCode::ALIPAY_NOTIFY_SUC, __FILE__, __LINE__);
        $order = OrderLogic::getInstance()->findOrderBySn($order_sn);
        if (empty($order)) {
            $this->failReturn("Order not exist", __FILE__, __LINE__);
        }
        if ($order[\'order_status\'] == OrderConstant::ORDER_UN_PAY) {
            M()->startTrans();
            // 改变订单状态
            OrderLogic::getInstance()->pay($order_sn, OrderConstant::PAY_TYPE_ALIPAY);

            // 获取更新后的订单,并回调处理
            $order = OrderLogic::getInstance()->findOrderBySn($order_sn);
            $resut = PaySuccessLogic::process($order);
            Log::writeJmqNoticeLog(ErrorCode::ALIPAY_NOTIFY_FAIL_MSG, ErrorCode::ALIPAY_NOTIFY_FAIL, __FILE__,
                __LINE__);
            if ($resut) {//成功 消息入队列
                M()->commit();
            } else {//钱已到账 数据库 入库操作回滚
                M()->rollback();
            }
            return true;
        }
        return false;
    } else {
        Log::writeJmqNoticeLog(ErrorCode::ALIPAY_NOTIFY_FAIL_MSG, ErrorCode::ALIPAY_NOTIFY_FAIL, __FILE__,
            __LINE__);
        $this->failReturn("支付失败!", __FILE__, __LINE__);
    }
}


分类:

技术点:

相关文章:

猜你喜欢