1. WeChat 배경 설정
1. 테스트 인증 디렉토리 및 테스트 화이트리스트 추가:
WeChat 배경에서 xxx.sinaapp.com/example/과 같은 테스트 인증 디렉터리를 설정하고 WeChat ID를 테스트 화이트리스트에 추가하세요.
여기서 '개인 위챗 ID'는 QQ 계정도 아니고 개인 닉네임도 아닙니다. 위챗에 로그인한 후 '나' 인터페이스의 '위챗 ID' 필드에 있는 문자열입니다.
결제 승인 디렉토리가 설정되어 있는지 여부는 테스트 중이므로 중요하지 않습니다.
2. List content
웹페이지 권한 도메인 이름 설정:
"개발자센터/인터페이스 권한표/웹페이지 계정/사용자 기본 정보를 얻기 위한 웹페이지 권한"에서 설정 . 웹페이지 승인 도메인 이름은 테스트 서버의 도메인 이름으로 설정됩니다. 예: xxx.sinaapp.com, http://는 필요하지 않습니다.
1. "계정 설정/API 보안/API 인증서"에서
다운로드하세요. 관리자의 휴대폰 인증번호가 필요합니다. 다운로드하고 압축을 푼 후 apiclient_key.pem 및 apiclient_cert.pem을 사용해야 합니다.
2. 결제 키
를 생성하고 "계정 설정/API 보안/API 키"에서 설정합니다. 결제 키는 결제 시 사용됩니다. 이 값은 소스 코드 구성 파일의 KEY 상수입니다.
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);
<a href="pay.php"> 获取openid</a></h4>
<?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['code'])) { // 触发微信返回code码 $url = $jsApi->createOauthUrlForCode(WxPayConf_pub::JS_API_CALL_URL); Header("Location: $url"); } else { // 获取code码,以获取openid $code = $_GET['code']; $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( 'getBrandWCPayRequest', <?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('WeixinJSBridgeReady', jsApiCall, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', 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>
최신 SDK 버전은 V3.7이지만 V3.7 데모(해당 예제는 작동하지 않음)를 다운로드하는 대신 V3 예제를 다운로드해야 합니다.
pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1
버튼이 여러 개 나타납니다. "JSAPI 결제" 버튼을 클릭하면 결제 금액이 1센트인 창이 나타납니다. 결제 성공 인터페이스가 나타납니다. 이쯤 되면 공식 결제 코드가 기본적으로 사용 가능하다는 뜻이고, 이를 기반으로 우리만의 코드로 수정하면 됩니다.
const APPID //公众号中“开发者中心”看到的AppID const MCHID //微信支付商户资料审核成功邮件中的商户号 const KEY //你在商户平台中设置的支付key const APPSECRET //公众号中“开发者中心”看到的AppSecret
class CLogFileHandler implements ILogHandler { private $fn=null; private $ss=null; public function construct($file = '') { $this->fn=str_replace("../logs/", "", $file); $this->ss=new SaeStorage(); } public function write($msg) { $bytes = $this->ss->read('log', $this->fn); $str = $bytes; $this->ss->write('log', $this->fn, "$str\n$msg"); } public function destruct() { $fn=null; $ss=null; } }
본 도구는 '스캔결제'를 검증하기 위한 도구이지만, '매개변수 추가' 버튼과 '매개변수 삭제' 버튼을 통해 '공식계좌 결제' 테스트에도 사용할 수 있습니다. 예를 들어 제출한 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>
"서명 생성"을 클릭합니다. 획득한 서명과 로그 파일의 서명을 비교하여 일관성이 있는지 확인하면 서명 알고리즘의 문제를 해결할 수 있습니다.
두 서명이 일치한다면 확실히 결제키에 문제가 있는 것입니다. 제품 MM이 실수를 하였거나, AppSecret과 결제 키가 역전되었거나(한 번은 제품 MM이 잘못된 결제 키를 사용하라고 해서 3일의 시간을 낭비했습니다! 매번 모든 코드를 반복적으로 확인했습니다. 배경 설정 후) 매개변수를 확인하고 드디어 '결제 인터페이스 디버깅 도구'를 사용해 서명이 맞는지 확인했는데, 문제는 결제 키였기 때문에 관리자가 아니기 때문에 상품 MM에 모바일을 요청했습니다. 전화 인증 코드를 입력하고 결제 키를 재설정하면 한 번의 클릭으로 코드가 작동됩니다)
WeChat 공개 계정 플랫폼 소스 코드 다운로드
2. WeChat 공식 계정 개발 중 신용카드 결제 예시 튜토리얼 공유
WeChat 결제 개발 중 신용카드 결제 예시에 대한 자세한 설명
위 내용은 WeChat 개발을 위한 WeChat 결제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!