English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

PHPでAPP端の微信支払機能を開発

PHPでAPP端の微信決済を開発する一つの個人的な心得

最近、会社の要件により、APP端の微信決済を開発する必要がありました。微信のドキュメントを読み、とても良いと感じました。大きなトラブルに直面することはありませんでした。注意すべきポイントはそれほど多くありません。

メモ帳としてノートを作成します。

APP決済プロセス

上の画像から、注意すべきプロセスは以下の通りです:3部分;
第一部分:注文APIを呼び出し、予支付注文を返し、再び情報を返す後に署名します(4、5、6、7)
第二部分:非同期通知(15、16)
最後の部分:支払い結果の最終的な判断
最も注意すべきは最初の部分:注文APIを呼び出し、予支付注文を返し、再び情報を返す後に署名します

微信文档詳細は以下に記載されていますので、ここでは省略します。

以下の私のコードを参考に、少し修正して使えます。

//エントリーファンクション
function weChatPay(){
   $json = array();
   //生成预支付交易单的必选参数:
   $newPara = array();
   //アプリID
   $newPara["appid"] = "wx2421b1c4370ec43"b";
   //店のID
   $newPara["mch_id"] = "10000100";
   //デバイスID
   $newPara["device_info"] = "WEB";
   //ランダムな文字列、ここでは関数を使用することをお勧めします
   $newPara["nonce_str"] = "1add1a30ac87aa2db72f57a2375d8fec"
   //商品説明
   $newPara["body"] = "APP決済テスト";
   //店の注文番号、ここは店の内部の注文番号
   $newPara["out_trade_no"] = "1415659990";
   //総額
   $newPara["total_fee"] = 1;
   //端末IP
   $newPara["spbill_create_ip"] = $_SERVER["REMOTE_ADDR"];
   //通知地址,注意,这里的URL中不要添加参数
   $newPara["notify_url"] = "http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php";
   //交易类型
   $newPara["trade_type"] = "APP";
   //第一次签名
   $newPara["sign"] = produceWeChatSign($newPara);
   //将数组转换为xml格式
   $xmlData = getWeChatXML($newPara);
   //利用PHP的CURL包,将数据发送给微信统一下单接口,返回正常的prepay_id
   $get_data = sendPrePayCurl($xmlData);
   //对返回的结果进行判断。
   if($get_data['return_code'] == "SUCCESS" && $get_data['result_code'] == "SUCCESS"){
    //根据微信支付返回的结果进行二次签名
    //二次签名所需的随机字符串
    $newPara["nonce_str"] = "5K8264ILTKCH16CQ2502SI8ZNMTM67VS";
    //二次签名所需的时间戳
    $newPara['timeStamp'] = time()."";
    //二次签名剩余参数的补充
    $secondSignArray = array(
     "appid"=>$newPara['appid'],
     "noncestr"=>$newPara['nonce_str'],
     "package"=>"Sign=WXPay",
     "prepayid"=>$get_data['prepay_id'],
     "partnerid"=>$newPara['mch_id'],
     "timestamp"=>$newPara['timeStamp'],
    );
    $json['datas'] = $secondSignArray;
    $json['ordersn'] = $newPara["out_trade_no"];
    $json['datas']['sign'] = weChatSecondSign($newPara,$get_data['prepay_id']);
    $json['message'] = "预支付完成";
    //预支付完成、以下进行自己的内部业务逻辑
    /*****************************/
    return json_encode($json);
   }
   else{
    $json['message'] = $get_data['return_msg'];
   }
  }
  return json_encode($json);
 }
//第一次签名的函数produceWeChatSign
function produceWeChatSign($newPara){
  $stringA = self::getSignContent($newPara);
  $stringSignTemp=$stringA."&key=192006250b4c09247ec02edce69f6a2d";
  return strtoupper(MD5($stringSignTemp));
 }
//XML形式の生成関数
 public static function getWeChatXML($newPara){
  $xmlData = "<xml>";
  foreach ($newPara as $key => $value) {
   $xmlData = $xmlData."<".$key.">".$value."</".$key.">";
  }
  $xmlData = $xmlData."</xml>";
  return $xmlData;
 }
//微信インターフェースにデータをcurlを通じて送信する関数
function sendPrePayCurl($xmlData) {
  $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
  $header[] = "Content-type: text/xml";
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($curl, CURLOPT_POST, 1);
  curl_setopt($curl, CURLOPT_POSTFIELDS, $xmlData);
  $data = curl_exec($curl);
  if (curl_errno($curl)) {
   print curl_error($curl);
  }
  curl_close($curl);
  return self::XMLDataParse($data);
 }
//xml形式データ解析関数
 public static function XMLDataParse($data){
  $msg = array();
  $msg = (array)simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA);
  return $msg;
 }
//二次署名の関数
function weChatSecondSign($newPara,$prepay_id){
  $secondSignArray = array(
   "appid"=>$newPara['appid'],
   "noncestr"=>$newPara['nonce_str'],
   "package"=>"Sign=WXPay",
   "prepayid"=>$prepay_id,
   "partnerid"=>$newPara['mch_id'],
   "timestamp"=>$newPara['timeStamp'],
  );
  $stringA = self::getSignContent($secondSignArray);
  $stringSignTemp=$stringA."&key=192006250b4c09247ec02edce69f6a2d";
  return strtoupper(MD5($stringSignTemp));
 }

注意点の二つ:

1.二重署名はバックエンドで完了し、完了後は二重署名に使用されたすべての情報を一緒にフロントエンドに渡し、ウェブアプリケーションがウェイブペイメントを呼び出すようにします。これにより、ウェイブペイメントを呼び出すことができない状況が発生しにくくなります。
2.二重署名は異なるランダムな文字列を使用しています。

これでこの記事はすべて終わりです。皆様の学習に役立つことを願っています。また、呐喊ガイドを多くの人がサポートしてくれることを願っています。

声明:この記事の内容はインターネットから取得しており、著作権者は所有者であり、インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、このサイトは所有権を持ちません。また、人工編集は行われておらず、関連する法的責任も負いません。著作権侵害を疑う内容があれば、メールを送信してください:notice#oldtoolbag.com(メール送信時は、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認がついたら、このサイトは即座に侵害疑いのコンテンツを削除します。)

おすすめ