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

تحقيق وظيفة دفع WeChat Pay في تطبيق APP باستخدام PHP

مقدمة

ملاحظات شخصية حول تطوير دفع واتساب على الجانب APP باستخدام PHP

في الآونة الأخيرة، بسبب الحاجة إلى الشركة، يجب تطوير دفع واتساب على الجانب APP، قرأت وثائق واتساب، شعرت بأنها جيدة، لم ألتقي بأي فخ كبير، لم يكن هناك الكثير من النقاط التي يجب الانتباه إليها.

أكتب مذكرة كمساعدة تذكير.

عملية دفع APP
من الصورة أعلاه، يمكن ملاحظة أن العملية التي يجب الانتباه إليها تتكون من 3 أجزاء؛
الجزء الأول: استدعاء API طلب الدفع، عودة معاملة الدفع المسبق، ثم التوقيع مرة أخرى عودة المعلومات (4،5،6،7)
الجزء الثاني: التنبيه المسبق (15،16)
الجزء الثالث: الحكم على نتيجة الدفع النهائية

أهم ما يجب الانتباه إليه هو الجزء الأول: استدعاء API طلب الدفع، عودة معاملة الدفع المسبق، ثم التوقيع مرة أخرى عودة المعلوماتدليل واتساب

بإيضاحات مفصلة، لن أكرر ذلك هنا.

附录一下我的代码،伸手党,稍微改点代码就可以用了。
//: دالة المدخل
   function weChatPay(){
   //: المعلمات الإلزامية لإنشاء معاملة الدفع المسبق
   $json = array();
   //: معرف التطبيق
   $newPara["appid"] = ":wx2421b1c4370ec43b";
   //: رقم البائع
   $newPara["mch_id"] = ":10000100";
   //: رقم الجهاز
   $newPara["device_info"] = ":WEB";
   //: نص عشوائي، يُنصح باستخدام دالة لإنشائه
   $newPara["nonce_str"] = ":1add1a30ac87aa2db72f57a2375d8fec";
   //: وصف المنتج
   $newPara["body"] = ":APP支付测试";
   //: رقم الطلب التجاري للمستخدم، وهو رقم الطلب الداخلي للمستخدم الخاص بك
   $newPara["out_trade_no"] = ":1415659990";
   //: المبلغ الإجمالي
   $newPara["total_fee"] = 1;
   //: عنوان النهاية للجهاز
   $newPara["spbill_create_ip"] = $_SERVER["REMOTE_ADDR"];
   //: تنبيه عنوان، يرجى الانتباه، لا تضيفوا أي متغيرات في هذا العنوان
   $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. يجب إكمال التوقيع مرتين في الخلفية، و بعد إكمالها، يجب نقل جميع المعلومات المستخدمة في التوقيع المرتين إلى الأمام، لتمكين الجانب الأمامي من إثارة دفع WeChat Pay. هذا يجعل من الصعب أن لا يتمكن من إثارة دفع WeChat Pay.
2. يتم استخدام سلسلة عشوائية مختلفة في التوقيع مرتين.

هذا هو نهاية محتوى هذا المقال، نأمل أن يكون قد ساعدكم في التعلم، ونأمل أن تدعموا تعليمات النداء بشكل كبير.

البيان: محتويات هذا المقال تم جمعها من الإنترنت، ويتمتع صاحب الحقوق بالملكية، والمحتوى تم تقديمه من قبل مستخدمي الإنترنت بشكل متعاوني وتم تحميله بشكل مستقل، ولا يمتلك هذا الموقع حقوق الملكية، ولا يتم تعديل المحتوى بشكل يدوي، ولا يتحمل هذا الموقع أي مسؤولية قانونية. إذا اكتشفت محتوى مخالف للحقوق النشرية، فيرجى إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (الرجاء استبدال # بـ @ عند إرسال البريد الإلكتروني) للإبلاغ، وتقديم الدليل على ذلك، وسيتم حذف المحتوى المزعوم بشكل فوري إذا تم التحقق من صحة المعلومات.

أنت قد تحب