>  기사  >  백엔드 개발  >  PHP WeChat 개발: JSAPI 결제 구현 방법

PHP WeChat 개발: JSAPI 결제 구현 방법

WBOY
WBOY원래의
2023-05-13 19:21:202633검색

모바일 인터넷의 발전으로 WeChat은 사람들의 삶에 없어서는 안될 부분이 되었고 점점 더 많은 판매자가 WeChat 플랫폼에서 비즈니스를 수행하기로 선택했습니다. WeChat 결제 기능 구현은 판매자에게 매우 필요합니다. 이 기사에서는 PHP를 사용하여 JSAPI 결제를 구현하는 방법을 소개합니다.

먼저 JSAPI 결제가 무엇인지 이해해야 합니다. JSAPI는 WeChat 공식 계정의 일종의 결제 기능으로, JS를 통해 WeChat 결제 인터페이스를 호출하여 결제를 실현합니다. JSAPI 결제의 장점은 사용자가 다른 페이지로 이동할 필요 없이 WeChat에서만 결제하면 된다는 점이며 이는 더욱 편리합니다.

다음으로 준비해야 할 것은

  1. 위챗 가맹점 플랫폼 계정 등록 및 실명인증 완료
  2. 위챗 공식 계정 생성 및 공식 계정 인증 완료
  3. 위챗 결제 애플리케이션 ID(APPID) 획득 및 가맹점번호(MCHID)
  4. API비밀키 생성

위의 준비를 모두 마친 후, 위챗 통합결제 API의 PHP SDK를 다운로드 해야 합니다. GitHub에서 "wechatpay-GuzzleHttp"를 검색하신 후 다운로드 하시면 됩니다. 프로젝트의 루트 디렉터리에 있습니다.

다음으로 JSAPI 결제를 구현하기 위한 PHP 코드를 작성해야 합니다. 먼저 파일을 도입해야 합니다.

require_once 'wechatpay-GuzzleHttp/autoload.php';
use WeChatPayGuzzleMiddlewareUtilPemUtil;
use WeChatPayGuzzleMiddlewareWeChatPayMiddleware;
use GuzzleHttpClient;
use GuzzleHttpHandlerStack;

그런 다음 관련 매개변수를 설정하고 GuzzleHttpClient 객체를 생성해야 합니다.

// 设置相关参数
$appid = "xxxxxxxxx"; // 微信支付的应用ID(APPID)
$mchid = "xxxxxxxxx"; // 商户号(MCHID)
$apiKey = "xxxxxxxxx"; // APISecret密钥
$notifyUrl = "http://example.com/notify.php"; // 异步通知URL

// 创建GuzzleHttpClient对象
$stack = HandlerStack::create();
$privateKey = PemUtil::loadPrivateKey('file://path/to/your/key.pem'); // 加载私钥文件
$wechatpayMiddleware = WeChatPayMiddleware::builder()
    ->withMerchant($appid, $mchid, $apiKey)
    ->withNotifyUrl($notifyUrl)
    ->withKey($privateKey)   
    ->build();
$stack->push($wechatpayMiddleware, 'wechatpay');
$client = new Client(['handler' => $stack, 'verify' => false]);

위 코드에서는 타사 PHP 라이브러리 "wechatpay-GuzzleHttp"를 사용합니다. 미들웨어를 통해 요청 및 응답 처리를 구현하여 WeChat 결제 API를 캡슐화합니다.

그런 다음 사용자의 openid를 가져오는 코드를 작성해야 합니다.

// 获取用户的openid
$code = $_GET['code']; // 通过微信OAuth2.0授权获取的code
$accessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$appid}&secret={$secret}&code={$code}&grant_type=authorization_code";
$accessTokenResponse = $client->get($accessTokenUrl);
$accessTokenBody = $accessTokenResponse->getBody()->getContents();
$accessToken = json_decode($accessTokenBody, true)['access_token'];
$openid = json_decode($accessTokenBody, true)['openid'];

위 코드에서는 OAuth2.0 인증을 통해 사용자의 access_token 및 openid를 가져오고 후속 결제 프로세스에서는 openid를 사용해야 합니다.

마지막으로 JSAPI 결제 코드를 작성해야 합니다.

// 支付
$request = $client->request('POST', 'https://api.mch.weixin.qq.com/pay/unifiedorder', [
    'xml' => [
        'body' => '商品描述',
        'out_trade_no' => '商户订单号',
        'fee_type' => 'CNY',
        'total_fee' => '1',
        'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],
        'notify_url' => $notifyUrl,
        'trade_type' => 'JSAPI',
        'openid' => $openid,
        'sign_type' => 'MD5',
        'nonce_str' => uniqid(),
        'appid' => $appid,
        'mch_id' => $mchid,
    ],
]);
$response = $request->getBody()->getContents();
$xml = simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA);
$resultCode = json_decode(json_encode($xml), true)['result_code'];
if ($resultCode == 'SUCCESS') {
    $prepayId = json_decode(json_encode($xml), true)['prepay_id'];
    $jsapiConfig = [
        'appId' => $appid,
        'timestamp' => time(),
        'nonceStr' => uniqid(),
        'package' => "prepay_id={$prepayId}",
        'signType' => 'MD5',
    ];
    $jsapiConfig['paySign'] = sign($jsapiConfig, $apiKey); // 生成签名
    $jsapiConfig['debug'] = true; // 开启调试模式
    $jsapiConfigJson = json_encode($jsapiConfig);
    $jsapi = <<<EOF
<script>
wx.config({}); // 微信JS-SDK配置
wx.ready(function() {
    wx.chooseWXPay({
        timestamp: '{$jsapiConfig['timestamp']}',
        nonceStr: '{$jsapiConfig['nonceStr']}',
        package: '{$jsapiConfig['package']}',
        signType: '{$jsapiConfig['signType']}',
        paySign: '{$jsapiConfig['paySign']}',
        success: function(res) {
            // 支付成功调用的函数
        },
        fail: function(res) {
            // 支付失败调用的函数
        }
    });
});
</script>
EOF;
echo $jsapi; // 输出JSAPI支付代码
}

// 生成签名
function sign($data, $apiKey)
{
    ksort($data);
    $query = urldecode(http_build_query($data) . "&key={$apiKey}");
    return strtoupper(md5($query));
}

위 코드에서는 WeChat JS-SDK의 "chooseWXPay" 기능을 사용하여 결제 기능을 구현합니다. 구체적으로 WeChat Pay 통합 주문 API를 호출하여 선불 거래 세션 ID(prepay_id)를 얻은 다음 생성된 jsapi 매개변수를 chooseWXPay 함수에 전달하여 결제를 위한 WeChat 결제 인터페이스를 호출합니다.

이 시점에서 JSAPI 결제를 성공적으로 구현했습니다. 요약하면, JSAPI 결제를 구현하려면 다음 단계를 완료해야 합니다.

  1. WeChat 가맹점 플랫폼 계정 등록 및 실명 인증 완료
  2. WeChat 공식 계정 생성 및 공식 계정 인증 완료
  3. 애플리케이션 ID(APPID) 받기 ) 및 WeChat 결제의 판매자 번호(MCHID) )
  4. API 비밀 키 생성
  5. WeChat 통합 결제 API의 PHP SDK를 다운로드하고 관련 파일을 소개합니다.
  6. 사용자의 openid를 가져옵니다.
  7. WeChat Pay 통합 주문 API를 호출하여 선불 거래 세션을 생성합니다. ID(prepay_id)
  8. chooseWXPay 기능을 통해 WeChat 결제 인터페이스 불러오기

이 글의 소개가 PHP 개발자가 JSAPI 결제 기능을 빠르게 구현하는 데 도움이 되기를 바랍니다.

위 내용은 PHP WeChat 개발: JSAPI 결제 구현 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.