>  기사  >  위챗 애플릿  >  WeChat 개발을 위한 WeChat 결제

WeChat 개발을 위한 WeChat 결제

零下一度
零下一度원래의
2017-05-27 13:31:172565검색

1. WeChat 배경 설정

1. 테스트 인증 디렉토리 및 테스트 화이트리스트 추가:

WeChat 배경에서 xxx.sinaapp.com/example/과 같은 테스트 인증 디렉터리를 설정하고 WeChat ID를 테스트 화이트리스트에 추가하세요.
여기서 '개인 위챗 ID'는 QQ 계정도 아니고 개인 닉네임도 아닙니다. 위챗에 로그인한 후 '나' 인터페이스의 '위챗 ID' 필드에 있는 문자열입니다.
결제 승인 디렉토리가 설정되어 있는지 여부는 테스트 중이므로 중요하지 않습니다.

2. List content

웹페이지 권한 도메인 이름 설정:
"개발자센터/인터페이스 권한표/웹페이지 계정/사용자 기본 정보를 얻기 위한 웹페이지 권한"에서 설정 . 웹페이지 승인 도메인 이름은 테스트 서버의 도메인 이름으로 설정됩니다. 예: xxx.sinaapp.com, http://는 필요하지 않습니다.

2. 가맹점 플랫폼 설정

1. "계정 설정/API 보안/API 인증서"에서

다운로드하세요. 관리자의 휴대폰 인증번호가 필요합니다. 다운로드하고 압축을 푼 후 apiclient_key.pem 및 apiclient_cert.pem을 사용해야 합니다.

2. 결제 키

를 생성하고 "계정 설정/API 보안/API 키"에서 설정합니다. 결제 키는 결제 시 사용됩니다. 이 값은 소스 코드 구성 파일의 KEY 상수입니다.

3. 공식 V3.7 샘플 코드

1을 사용합니다. Wxpay.pub.config.php의 구성을 주로

    const APPID                 //公众号中“开发者中心”看到的AppID
    const MCHID                     //微信支付商户资料审核成功邮件中的商户号
    const KEY                   //你在商户平台中设置的支付key
    const APPSECRET             //公众号中“开发者中心”看到的AppSecret

    const JS_API_CALL_URL       //设置这个url,可在此页面中获得用户的openid。

    //证书路径,注意应该填写绝对路径
    const SSLCERT_PATH          // apiclient_cert.pem文件url
    const SSLKEY_PATH               // apiclient_key.pem文件url,如’/cert/ apiclient_key.pem’
    const NOTIFY_URL                //异步通知url,可使用demo中的notify_url.php

@&로 수정합니다. @2. 공식 코드의 버그 수정:

"curl_setopt()에서 매개변수 2가 길어질 것으로 예상합니다." 오류가 발생하는 이유는 WxPayPubHelper.php에 "curl_setopt"를 잘못 입력한 곳이 여러 군데 있기 때문입니다. "curl_setop"”, 수정하세요. "curl_close(): 11 is not a valid"가 나타나면 닫힌 컬 세션이 실수로 닫혔기 때문입니다.

if(gettype($ch) == 'resource') curl_close($ch);

3, 공식 데모에 다음 판단을 추가할 수 있습니다. 직접적으로 작동하는 것은 아닙니다. 우리가 스스로 알아내야 합니다. 먼저 index.php에 링크를 추가하세요:

<a href="pay.php"> 获取openid</a></h4>

3 그런 다음 pay.php 페이지를 작성하여 사용자의 openid를 얻고 결제를 시작하세요:

<?php
/**
 * JS_API支付demo
 * ====================================================
 * 在微信浏览器里面打开H5网页中执行JS调起支付。接口输入输出数据格式为JSON。
 * 成功调起支付需要三个步骤:
 * 步骤1:网页授权获取用户openid
 * 步骤2:使用统一支付接口,获取prepay_id
 * 步骤3:使用jsapi调起支付
 */
include_once ("WxPayPubHelper.php");

$jsApi = new JsApi_pub();
// =========步骤1:网页授权获取用户openid============
// 通过code获得openid
if (! isset($_GET[&#39;code&#39;])) {
 // 触发微信返回code码
 $url = $jsApi->createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL);
 Header("Location: $url");
} else {
 // 获取code码,以获取openid
 $code = $_GET[&#39;code&#39;];
 $jsApi->setCode($code);
 $openid = $jsApi->getOpenId();
}

$goods = "test";
// 使用统一支付接口
$unifiedOrder = new UnifiedOrder_pub();
$unifiedOrder->setParameter("openid", "$openid"); // 用户openid
$unifiedOrder->setParameter("body", "$goods"); // 商品描述
 // 自定义订单号,此处仅作举例
$timeStamp = time();
$out_trade_no = WxPayConf_pub::APPID . "$timeStamp"; // 商户订单号
$unifiedOrder->setParameter("out_trade_no", "$out_trade_no");
$price = "1";
$unifiedOrder->setParameter("total_fee", "$price"); // 总金额
$unifiedOrder->setParameter("notify_url", WxPayConf_pub::NOTIFY_URL); // 通知地址
$unifiedOrder->setParameter("trade_type", "JSAPI"); // 交易类型

$prepay_id = $unifiedOrder->getPrepayId();
// =========步骤3:使用jsapi调起支付============
$jsApi->setPrepayId($prepay_id);

$jsApiParameters = $jsApi->getParameters();
echo $jsApiParameters;

?>

<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<title>微信安全支付</title>

<script type="text/javascript">

 //调用微信JS api 支付
 function jsApiCall()
 {
 WeixinJSBridge.invoke(
 &#39;getBrandWCPayRequest&#39;,
 <?php echo $jsApiParameters; ?>,
 function(res){
 WeixinJSBridge.log(res.err_msg);
 //alert(res.err_code+res.err_desc+res.err_msg);
 }
 );
 }

 function callpay()
 {
 if (typeof WeixinJSBridge == "undefined"){
 if( document.addEventListener ){
 document.addEventListener(&#39;WeixinJSBridgeReady&#39;, jsApiCall, false);
 }else if (document.attachEvent){
 document.attachEvent(&#39;WeixinJSBridgeReady&#39;, jsApiCall); 
 document.attachEvent(&#39;onWeixinJSBridgeReady&#39;, jsApiCall);
 }
 }else{
 jsApiCall();
 }
 }
 </script>
</head>
<body>
    <p> </p>
    <p> </p>
    <p align="center">
        <table border="1">
            <tr>
                <td>openID</td>
                <td><?php echo $openid;?></td>
            </tr>
            <tr>
                <td>商品名称</td>
                <td><?php echo $goods;?></td>
            </tr>
            <tr>
                <td>订单号</td>
                <td><?php echo $out_trade_no;?></td>
            </tr>
            <tr>
                <td>prepay_id</td>
                <td><?php echo $prepay_id;?></td>
            </tr>
            <tr>
                <td>价格</td>
                <td><?php echo $price;?></td>
            </tr>
        </table>
        <button data-theme="b" type="button" onclick="callpay()">贡献一下</button>
    </p>
</body>
</html>

4. 공식 V3 코드 사용 예

1. 공식 샘플 코드 다운로드

최신 SDK 버전은 V3.7이지만 V3.7 데모(해당 예제는 작동하지 않음)를 다운로드하는 대신 V3 예제를 다운로드해야 합니다.

pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

2. 데모의 압축을 풀고 웹 루트 디렉터리에 넣습니다. 예를 들어, 압축된 패키지의 압축을 푼 후 디렉터리는 WxpayAPI_php_v3입니다. 이 디렉터리에 들어가서 모든 파일을 선택한 다음 프로젝트 디렉터리에 복사해야 합니다. 이 디렉터리에는 index.php가 있으므로 테스트할 때 xxx.sinaapp.com/index.php에 액세스해야 합니다.


3. index.php에 있는 태그의 URL 주소를 서버의 URL 주소로 변경하세요.

4. WeChat에서 대화 창을 열고 index.php 주소(예: xxx.sinaapp.com/index.php)를 입력한 다음 대화 창에서 이 링크를 클릭하세요.

버튼이 여러 개 나타납니다. "JSAPI 결제" 버튼을 클릭하면 결제 금액이 1센트인 창이 나타납니다. 결제 성공 인터페이스가 나타납니다. 이쯤 되면 공식 결제 코드가 기본적으로 사용 가능하다는 뜻이고, 이를 기반으로 우리만의 코드로 수정하면 됩니다.

5. cert 디렉터리의 apiclient_key.pem 및 apiclient_cert.pem을 자체 인증서로 바꿉니다.

6. WxPay.Config.php에서 다음 항목을 자신의 것으로 수정하십시오:

const APPID                 //公众号中“开发者中心”看到的AppID
const MCHID                     //微信支付商户资料审核成功邮件中的商户号
const KEY                   //你在商户平台中设置的支付key
const APPSECRET             //公众号中“开发者中心”看到的AppSecret

7. 우리는 Sina의 sae를 테스트 서버로 사용하기 때문에 sae는 파일의 직접 쓰기를 허용하지 않습니다. .io이므로 공식 웹사이트 코드의 파일 작업을 그에 따라 수정할 수 있습니다(SaeStorage 사용). 즉, log.php의 CLogFileHandler 클래스를 수정해야 합니다:

class CLogFileHandler implements ILogHandler
{
    private $fn=null;
    private $ss=null;
    public function construct($file = &#39;&#39;)
 {
        $this->fn=str_replace("../logs/", "", $file);
        $this->ss=new SaeStorage();
    }
    public function write($msg)
 {
        $bytes = $this->ss->read(&#39;log&#39;, $this->fn);
        $str = $bytes;
        $this->ss->write(&#39;log&#39;, $this->fn, "$str\n$msg");
    }
    public function destruct()
 {
        $fn=null;
        $ss=null;
    }
}

8. 서명 실패 오류가 발생하면 WeChat의 결제 인터페이스 디버깅 도구를 사용하여 테스트할 수 있습니다: pay.weixin.qq .com/wiki/tools/signverify/.

본 도구는 '스캔결제'를 검증하기 위한 도구이지만, '매개변수 추가' 버튼과 '매개변수 삭제' 버튼을 통해 '공식계좌 결제' 테스트에도 사용할 수 있습니다. 예를 들어 제출한 xml 콘텐츠가 다음과 같은 경우(로그 기능을 사용하여 제출된 xml 콘텐츠를 sae 저장소에 저장한 다음 로그 파일을 다운로드할 수 있음):

<xml><openid><![CDATA[om8888LTHBj99992Qgl_eUAOFgxs]]></openid><body><![CDATA[test]]></body><out_trade_no><![CDATA[wx111196222243ffa1143858aaaa]]></out_trade_no><total_fee>1</total_fee><notify_url><![CDATA[http://xxx.sinaapp.com/wxpay/demo/notify_url.php]]></notify_url><trade_type><![CDATA[JSAPI]]></trade_type><appid><![CDATA[wx000096104a431111]]></appid><mch_id>6666833333</mch_id><spbill_create_ip><![CDATA[10.211.76.107]]></spbill_create_ip><nonce_str><![CDATA[1agieoxyi8hc7e817rsnjlyn9lxmsnxj]]></nonce_str><sign><![CDATA[817034E4DE8E6067EB85CDF7318EF0A1]]></sign></xml>

를 입력할 수 있습니다. 테스트 도구의 양식은 다음과 같습니다.


WeChat 개발을 위한 WeChat 결제"서명 생성"을 클릭합니다. 획득한 서명과 로그 파일의 서명을 비교하여 일관성이 있는지 확인하면 서명 알고리즘의 문제를 해결할 수 있습니다.
두 서명이 일치한다면 확실히 결제키에 문제가 있는 것입니다. 제품 MM이 실수를 하였거나, AppSecret과 결제 키가 역전되었거나(한 번은 제품 MM이 잘못된 결제 키를 사용하라고 해서 3일의 시간을 낭비했습니다! 매번 모든 코드를 반복적으로 확인했습니다. 배경 설정 후) 매개변수를 확인하고 드디어 '결제 인터페이스 디버깅 도구'를 사용해 서명이 맞는지 확인했는데, 문제는 결제 키였기 때문에 관리자가 아니기 때문에 상품 MM에 모바일을 요청했습니다. 전화 인증 코드를 입력하고 결제 키를 재설정하면 한 번의 클릭으로 코드가 작동됩니다)

[관련 추천]

WeChat 공개 계정 플랫폼 소스 코드 다운로드

2. WeChat 공식 계정 개발 중 신용카드 결제 예시 튜토리얼 공유

WeChat 결제 개발 중 신용카드 결제 예시에 대한 자세한 설명

4 . 위챗 애플릿 결제 기능 개발 오류 요약

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

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