众所周知,PAYPAL直接仿牌的话,如果产品名称有大牌的话,容易被冻结。
所以,关键词替换是PAYPAL多账户轮询中,减少封号的一个必备的重要步骤。
主要针对独立网站对应哪些PAYPAL,每个PAYPAL要收多少次或者要收多少金额进行匹配。
后台可以方便的查看订单数量。
我们想看看正常下单的时候,PAYPAL标准支付是进行了哪些数据的提交!
先从一个demo站绑了PAYPAL标准支付进行下单。
我这里以wordpress+woocommerce的系统为例
并且记录下html的对应代码段
<form name="checkout" method="post" class="checkout woocommerce-checkout" action="https://bbs.affadsense.com/?page_id=8" enctype="multipart/form-data" novalidate="novalidate"><div class="col2-set" id="customer_details">
<div class="col-1">
<div class="woocommerce-billing-fields"><h3>Billing details</h3>
<p class="form-row my-field-class form-row-wide woocommerce-validated" id="autofill_checkout_field_field" data-priority=""><label for="autofill_checkout_field" class="">Enter your Billing address <span class="optional">(optional)</span></label><span class="woocommerce-input-wrapper"><input type="text" class="input-text " name="autofill_checkout_field" id="autofill_checkout_field" placeholder="Search to Autocomplete" value="" autocomplete="off"></span></p><div id="wcaf_custom_checkout_field"></div>
<div class="woocommerce-billing-fields__field-wrapper">
<p class="form-row form-row-first validate-required woocommerce-validated" id="billing_first_name_field" data-priority="10"><label for="billing_first_name" class="">First name <abbr class="required" title="required">*</abbr></label><span class="woocommerce-input-wrapper"><input type="text" class="input-text " name="billing_first_name" id="billing_first_name" placeholder="" value="" autocomplete="given-name"></span></p><p class="form-row form-row-last validate-required woocommerce-validated" id="billing_last_name_field" data-priority="20"><label for="billing_last_name" class="">Last name <abbr class="required" title="required">*</abbr></label><span class="woocommerce-input-wrapper"><input type="text" class="input-text " name="billing_last_name" id="billing_last_name" placeholder="" value="" autocomplete="family-name"></span></p><p class="form-row form-row-wide" id="billing_company_field" data-priority="30"><label for="billing_company" class="">Company name <span class="optional">(optional)</span></label><span class="woocommerce-input-wrapper"><input type="text" class="input-text " name="billing_company" id="billing_company" placeholder="" value="" autocomplete="organization"></span></p><p class="form-row form-row-wide address-field update_totals_on_change validate-required woocommerce-validated" id="billing_country_field" data-priority="40"><label for="billing_country" class="">Country <abbr class="required" title="required">*</abbr></label><span class="woocommerce-input-wrapper"><select name="billing_country" id="billing_country" class="country_to_state country_select select2-hidden-accessible" autocomplete="country" tabindex="-1" aria-hidden="true"><option value="">Select a country…</option><option value="AX">Åland Islands</option><option value="AF">Afghanistan</option><option value="AL">Albania</option><option value="DZ">Algeria</option><option value="AS">American Samoa</option><option value="AD">Andorra</option><option value="AO">Angola</option><option value="AI">Anguilla</option><option value="AQ">Antarctica</option><option value="AG">Antigua and Barbuda</option><option value="AR">Argentina</option><option value="AM">Armenia</option><option value="AW">Aruba</option><option value="AU">Australia</option><option value="AT">Austria</option><option value="AZ">Azerbaijan</option><option value="BS">Bahamas</option><option value="BH">Bahrain</option><option value="BD">Bangladesh</option><option value="BB">Barbados</option><option value="BY">Belarus</option><option value="PW">Belau</option><option value="BE">Belgium</option><option value="BZ">Belize</option><option value="BJ">Benin</option><option value="BM">Bermuda</option><option value="BT">Bhutan</option><option value="BO">Bolivia</option><option value="BQ">Bonaire, Saint Eustatius and Saba</option><option value="BA">Bosnia and Herzegovina</option><option value="BW">Botswana</option><option value="BV">Bouvet Island</option><option value="BR">Brazil</option><option value="IO">British Indian Ocean Territory</option><option value="BN">Brunei</option><option value="BG">Bulgaria</option><option value="BF">Burkina Faso</option><option value="BI">Burundi</option><option value="KH">Cambodia</option><option value="CM">Cameroon</option><option value="CA">Canada</option><option value="CV">Cape Verde</option><option value="KY">Cayman Islands</option><option value="CF">Central African Republic</option><option value="TD">Chad</option><option value="CL">Chile</option><option value="CN">China</option><option value="CX">Christmas Island</option><option value="CC">Cocos (Keeling) Islands</option><option value="CO">Colombia</option><option value="KM">Comoros</option><option value="CG">Congo (Brazzaville)</option><option value="CD">Congo (Kinshasa)</option><option value="CK">Cook Islands</option><option value="CR">Costa Rica</option><option value="HR">Croatia</option><option value="CU">Cuba</option><option value="CW">Curaçao</option><option value="CY">Cyprus</option><option value="CZ">Czech Republic</option><option value="DK">Denmark</option><option value="DJ">Djibouti</option><option value="DM">Dominica</option><option value="DO">Dominican Republic</option><option value="EC">Ecuador</option><option value="EG">Egypt</option><option value="SV">El Salvador</option><option value="GQ">Equatorial Guinea</option><option value="ER">Eritrea</option><option value="EE">Estonia</option><option value="ET">Ethiopia</option><option value="FK">Falkland Islands</option><option value="FO">Faroe Islands</option><option value="FJ">Fiji</option><option value="FI">Finland</option><option value="FR">France</option><option value="GF">French Guiana</option><option value="PF">French Polynesia</option><option value="TF">French Southern Territories</option><option value="GA">Gabon</option><option value="GM">Gambia</option><option value="GE">Georgia</option><option value="DE">Germany</option><option value="GH">Ghana</option><option value="GI">Gibraltar</option><option value="GR">Greece</option><option value="GL">Greenland</option><option value="GD">Grenada</option><option value="GP">Guadeloupe</option><option value="GU">Guam</option><option value="GT">Guatemala</option><option value="GG">Guernsey</option><option value="GN">Guinea</option><option value="GW">Guinea-Bissau</option><option value="GY">Guyana</option><option value="HT">Haiti</option><option value="HM">Heard Island and McDonald Islands</option><option value="HN">Honduras</option><option value="HK">Hong Kong</option><option value="HU">Hungary</option><option value="IS">Iceland</option><option value="IN">India</option><option value="ID">Indonesia</option><option value="IR">Iran</option><option value="IQ">Iraq</option><option value="IE">Ireland</option><option value="IM">Isle of Man</option><option value="IL">Israel</option><option value="IT">Italy</option><option value="CI">Ivory Coast</option><option value="JM">Jamaica</option><option value="JP">Japan</option><option value="JE">Jersey</option><option value="JO">Jordan</option><option value="KZ">Kazakhstan</option><option value="KE">Kenya</option><option value="KI">Kiribati</option><option value="KW">Kuwait</option><option value="KG">Kyrgyzstan</option><option value="LA">Laos</option><option value="LV">Latvia</option><option value="LB">Lebanon</option><option value="LS">Lesotho</option><option value="LR">Liberia</option><option value="LY">Libya</option><option value="LI">Liechtenstein</option><option value="LT">Lithuania</option><option value="LU">Luxembourg</option><option value="MO">Macao</option><option value="MG">Madagascar</option><option value="MW">Malawi</option><option value="MY">Malaysia</option><option value="MV">Maldives</option><option value="ML">Mali</option><option value="MT">Malta</option><option value="MH">Marshall Islands</option><option value="MQ">Martinique</option><option value="MR">Mauritania</option><option value="MU">Mauritius</option><option value="YT">Mayotte</option><option value="MX">Mexico</option><option value="FM">Micronesia</option><option value="MD">Moldova</option><option value="MC">Monaco</option><option value="MN">Mongolia</option><option value="ME">Montenegro</option><option value="MS">Montserrat</option><option value="MA">Morocco</option><option value="MZ">Mozambique</option><option value="MM">Myanmar</option><option value="NA">Namibia</option><option value="NR">Nauru</option><option value="NP">Nepal</option><option value="NL">Netherlands</option><option value="NC">New Caledonia</option><option value="NZ">New Zealand</option><option value="NI">Nicaragua</option><option value="NE">Niger</option><option value="NG">Nigeria</option><option value="NU">Niue</option><option value="NF">Norfolk Island</option><option value="KP">North Korea</option><option value="MK">North Macedonia</option><option value="MP">Northern Mariana Islands</option><option value="NO">Norway</option><option value="OM">Oman</option><option value="PK">Pakistan</option><option value="PS">Palestinian Territory</option><option value="PA">Panama</option><option value="PG">Papua New Guinea</option><option value="PY">Paraguay</option><option value="PE">Peru</option><option value="PH">Philippines</option><option value="PN">Pitcairn</option><option value="PL">Poland</option><option value="PT">Portugal</option><option value="PR">Puerto Rico</option><option value="QA">Qatar</option><option value="RE">Reunion</option><option value="RO">Romania</option><option value="RU">Russia</option><option value="RW">Rwanda</option><option value="ST">São Tomé and Príncipe</option><option value="BL">Saint Barthélemy</option><option value="SH">Saint Helena</option><option value="KN">Saint Kitts and Nevis</option><option value="LC">Saint Lucia</option><option value="SX">Saint Martin (Dutch part)</option><option value="MF">Saint Martin (French part)</option><option value="PM">Saint Pierre and Miquelon</option><option value="VC">Saint Vincent and the Grenadines</option><option value="WS">Samoa</option><option value="SM">San Marino</option><option value="SA">Saudi Arabia</option><option value="SN">Senegal</option><option value="RS">Serbia</option><option value="SC">Seychelles</option><option value="SL">Sierra Leone</option><option value="SG">Singapore</option><option value="SK">Slovakia</option><option value="SI">Slovenia</option><option value="SB">Solomon Islands</option><option value="SO">Somalia</option><option value="ZA">South Africa</option><option value="GS">South Georgia/Sandwich Islands</option><option value="KR">South Korea</option><option value="SS">South Sudan</option><option value="ES">Spain</option><option value="LK">Sri Lanka</option><option value="SD">Sudan</option><option value="SR">Suriname</option><option value="SJ">Svalbard and Jan Mayen</option><option value="SZ">Swaziland</option><option value="SE">Sweden</option><option value="CH">Switzerland</option><option value="SY">Syria</option><option value="TW">Taiwan</option><option value="TJ">Tajikistan</option><option value="TZ">Tanzania</option><option value="TH">Thailand</option><option value="TL">Timor-Leste</option><option value="TG">Togo</option><option value="TK">Tokelau</option><option value="TO">Tonga</option><option value="TT">Trinidad and Tobago</option><option value="TN">Tunisia</option><option value="TR">Turkey</option><option value="TM">Turkmenistan</option><option value="TC">Turks and Caicos Islands</option><option value="TV">Tuvalu</option><option value="UG">Uganda</option><option value="UA">Ukraine</option><option value="AE">United Arab Emirates</option><option value="GB">United Kingdom (UK)</option><option value="US">United States (US)</option><option value="UM">United States (US) Minor Outlying Islands</option><option value="UY">Uruguay</option><option value="UZ">Uzbekistan</option><option value="VU">Vanuatu</option><option value="VA">Vatican</option><option value="VE">Venezuela</option><option value="VN">Vietnam</option><option value="VG">Virgin Islands (British)</option><option value="VI">Virgin Islands (US)</option><option value="WF">Wallis and Futuna</option><option value="EH">Western Sahara</option><option value="YE">Yemen</option><option value="ZM">Zambia</option><option value="ZW">Zimbabwe</option></select><span class="select2 select2-container select2-container--default" dir="ltr" style="width: 100%;"><span class="selection"><span class="select2-selection select2-selection--single" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-labelledby="select2-billing_country-container" role="combobox"><span class="select2-selection__rendered" id="select2-billing_country-container" role="textbox" aria-readonly="true" title="United States (US)">United States (US)</span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span></span></span><span class="dropdown-wrapper" aria-hidden="true"></span></span><noscript><button type="submit" name="woocommerce_checkout_update_totals" value="Update country">Update country</button></noscript></span></p><p class="form-row form-row-wide address-field validate-required woocommerce-validated" id="billing_address_1_field" data-priority="50"><label for="billing_address_1" class="">Street address <abbr class="required" title="required">*</abbr></label><span class="woocommerce-input-wrapper"><input type="text" class="input-text " name="billing_address_1" id="billing_address_1" placeholder="House number and street name" value="" autocomplete="address-line1" data-placeholder="House number and street name"></span></p><p class="form-row form-row-wide address-field" id="billing_address_2_field" data-priority="60"><label for="billing_address_2" class="screen-reader-text">Apartment, suite, unit etc. (optional) <span class="optional">(optional)</span></label><span class="woocommerce-input-wrapper"><input type="text" class="input-text " name="billing_address_2" id="billing_address_2" placeholder="Apartment, suite, unit etc. (optional)" value="" autocomplete="address-line2" data-placeholder="Apartment, suite, unit etc. (optional)"></span></p><p class="form-row form-row-wide address-field validate-required woocommerce-validated" id="billing_city_field" data-priority="70" data-o_class="form-row form-row-wide address-field validate-required"><label for="billing_city" class="">Town / City <abbr class="required" title="required">*</abbr></label><span class="woocommerce-input-wrapper"><input type="text" class="input-text " name="billing_city" id="billing_city" placeholder="" value="" autocomplete="address-level2"></span></p><p class="form-row form-row-wide address-field validate-required validate-state woocommerce-validated" id="billing_state_field" data-priority="80" data-o_class="form-row form-row-wide address-field validate-required validate-state woocommerce-invalid woocommerce-invalid-required-field"><label for="billing_state" class="">State <abbr class="required" title="required">*</abbr></label><span class="woocommerce-input-wrapper"><select name="billing_state" id="billing_state" class="state_select select2-hidden-accessible" autocomplete="address-level1" data-placeholder="Select an option…" data-input-classes="" tabindex="-1" aria-hidden="true"><option value="">Select an option…</option><option value="AL">Alabama</option><option value="AK">Alaska</option><option value="AZ">Arizona</option><option value="AR">Arkansas</option><option value="CA">California</option><option value="CO">Colorado</option><option value="CT">Connecticut</option><option value="DE">Delaware</option><option value="DC">District Of Columbia</option><option value="FL">Florida</option><option value="GA">Georgia</option><option value="HI">Hawaii</option><option value="ID">Idaho</option><option value="IL">Illinois</option><option value="IN">Indiana</option><option value="IA">Iowa</option><option value="KS">Kansas</option><option value="KY">Kentucky</option><option value="LA">Louisiana</option><option value="ME">Maine</option><option value="MD">Maryland</option><option value="MA">Massachusetts</option><option value="MI">Michigan</option><option value="MN">Minnesota</option><option value="MS">Mississippi</option><option value="MO">Missouri</option><option value="MT">Montana</option><option value="NE">Nebraska</option><option value="NV">Nevada</option><option value="NH">New Hampshire</option><option value="NJ">New Jersey</option><option value="NM">New Mexico</option><option value="NY">New York</option><option value="NC">North Carolina</option><option value="ND">North Dakota</option><option value="OH">Ohio</option><option value="OK">Oklahoma</option><option value="OR">Oregon</option><option value="PA">Pennsylvania</option><option value="RI">Rhode Island</option><option value="SC">South Carolina</option><option value="SD">South Dakota</option><option value="TN">Tennessee</option><option value="TX">Texas</option><option value="UT">Utah</option><option value="VT">Vermont</option><option value="VA">Virginia</option><option value="WA">Washington</option><option value="WV">West Virginia</option><option value="WI">Wisconsin</option><option value="WY">Wyoming</option><option value="AA">Armed Forces (AA)</option><option value="AE">Armed Forces (AE)</option><option value="AP">Armed Forces (AP)</option></select><span class="select2 select2-container select2-container--default" dir="ltr" style="width: 100%;"><span class="selection"><span class="select2-selection select2-selection--single" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-labelledby="select2-billing_state-container" role="combobox"><span class="select2-selection__rendered" id="select2-billing_state-container" role="textbox" aria-readonly="true" title="New Mexico">New Mexico</span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span></span></span><span class="dropdown-wrapper" aria-hidden="true"></span></span></span></p><p class="form-row form-row-wide address-field validate-required validate-postcode woocommerce-validated" id="billing_postcode_field" data-priority="90" data-o_class="form-row form-row-wide address-field validate-required validate-postcode"><label for="billing_postcode" class="">ZIP <abbr class="required" title="required">*</abbr></label><span class="woocommerce-input-wrapper"><input type="text" class="input-text " name="billing_postcode" id="billing_postcode" placeholder="" value="" autocomplete="postal-code"></span></p><p class="form-row form-row-wide validate-required validate-phone woocommerce-validated" id="billing_phone_field" data-priority="100"><label for="billing_phone" class="">Phone <abbr class="required" title="required">*</abbr></label><span class="woocommerce-input-wrapper"><input type="tel" class="input-text " name="billing_phone" id="billing_phone" placeholder="" value="" autocomplete="tel"></span></p><p class="form-row form-row-wide validate-required validate-email woocommerce-validated" id="billing_email_field" data-priority="110"><label for="billing_email" class="">Email address <abbr class="required" title="required">*</abbr></label><span class="woocommerce-input-wrapper"><input type="email" class="input-text " name="billing_email" id="billing_email" placeholder="" value="" autocomplete="email username"></span></p></div></div>
</div>
<div class="col-2">
<div class="woocommerce-shipping-fields">
</div>
<div class="woocommerce-additional-fields"><h3>Additional information</h3>
<div class="woocommerce-additional-fields__field-wrapper">
<p class="form-row notes" id="order_comments_field" data-priority=""><label for="order_comments" class="">Order notes <span class="optional">(optional)</span></label><span class="woocommerce-input-wrapper"><textarea name="order_comments" class="input-text " id="order_comments" placeholder="Notes about your order, e.g. special notes for delivery." rows="2" cols="5"></textarea></span></p> </div></div>
</div>
</div><h3 id="order_review_heading">Your order</h3>
<div id="order_review" class="woocommerce-checkout-review-order">
<table class="shop_table woocommerce-checkout-review-order-table" style="position: static; zoom: 1;">
<thead>
<tr>
<th class="product-name">Product</th>
<th class="product-total">Subtotal</th>
</tr>
</thead>
<tbody>
<tr class="cart_item">
<td class="product-name"> 【ready stock 】S3 Level Men's Steel Toe Work Safety Shoes <strong class="product-quantity">× 1</strong> </td>
<td class="product-total">
<span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">$</span>36.00</span> </td>
</tr>
<tr class="cart_item">
<td class="product-name"> 【Ready stock】2020 Black Driving Mens Loafers Moccasins Breathable Slip onShoes <strong class="product-quantity">× 1</strong> </td>
<td class="product-total">
<span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">$</span>32.00</span> </td>
</tr>
</tbody>
<tfoot><tr class="cart-subtotal">
<th>Subtotal</th>
<td><span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">$</span>68.00</span></td>
</tr><tr class="order-total">
<th>Total</th>
<td><strong><span class="woocommerce-Price-amount amount"><span class="woocommerce-Price-currencySymbol">$</span>68.00</span></strong> </td>
</tr></tfoot>
</table><div id="payment" class="woocommerce-checkout-payment" style="position: static; zoom: 1;">
<ul class="wc_payment_methods payment_methods methods">
<li class="wc_payment_method payment_method_paypal">
<input id="payment_method_paypal" type="radio" class="input-radio" name="payment_method" value="paypal" checked="checked" data-order_button_text="Proceed to PayPal" style="display: none;"><label for="payment_method_paypal">
PayPal <img src="https://www.paypalobjects.com/webstatic/mktg/logo/AM_mc_vs_dc_ae.jpg" alt="PayPal acceptance mark"><a href="https://www.paypal.com/us/webapps/mpp/paypal-popup" class="about_paypal" onclick="javascript:window.open('https://www.paypal.com/us/webapps/mpp/paypal-popup','WIPaypal','toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, width=1060, height=700'); return false;">What is PayPal?</a> </label>
<div class="payment_box payment_method_paypal">
<p>Pay via PayPal; you can pay with your credit card if you don’t have a PayPal account.</p>
</div>
</li>
</ul>
<div class="form-row place-order">
<noscript>
Since your browser does not support JavaScript, or it is disabled, please ensure you click the <em>Update Totals</em> button before placing your order. You may be charged more than the amount stated above if you fail to do so. <br/><button type="submit" class="button alt" name="woocommerce_checkout_update_totals" value="Update totals">Update totals</button>
</noscript><div class="woocommerce-terms-and-conditions-wrapper">
<div class="woocommerce-privacy-policy-text"><p>Your personal data will be used to process your order, support your experience throughout this website, and for other purposes described in our <a href="https://guiasaudes.info/?page_id=3" class="woocommerce-privacy-policy-link" target="_blank">privacy policy</a>.</p>
</div>
</div><button type="submit" class="button alt" name="woocommerce_checkout_place_order" id="place_order" value="Place order" data-value="Place order">Proceed to PayPal</button>
<input type="hidden" id="woocommerce-process-checkout-nonce" name="woocommerce-process-checkout-nonce" value="14d564ec0e"><input type="hidden" name="_wp_http_referer" value="/?wc-ajax=update_order_review"> </div>
</div></div>
</form>
然后对应F12查看源码抓发送到paypal的网络记录
先POST到https://bbs.affadsense.com/?wc-ajax=checkout
然后跳转到PAYPAL网址
PAYPAL这段网址去URL ENCODE后,是这样子
https://www.paypal.com/cgi-bin/webscr?cmd=_cart&[email protected]&no_note=1¤cy_code=USD&charset=utf-8&rm=2&upload=1&return=https://bbs.affadsense.com/?page_id=8&order-received=342&key=wc_order_R0h8x24NncmNu&utm_nooverride=1&cancel_return=https://bbs.affadsense.com/?page_id=7&cancel_order=true&order=wc_order_R0h8x24NncmNu&order_id=342&redirect&_wpnonce=660a44ce83&page_style=&image_url=&paymentaction=sale&invoice=WC-342&custom={"order_id":342,"order_key":"wc_order_R0h8x24NncmNu"}¬ify_url=https://bbs.affadsense.com/?wc-api=WC_Gateway_Paypal&first_name=Russell&last_name=Jack&address1=P.O.Box+621&address2=&city=clovis&state=NM&zip=88102&country=US&[email protected]&night_phone_a=362&night_phone_b=693&night_phone_c=5941&no_shipping=1&tax_cart=0.00&item_name_1=ãready+stock+ãS3+Level+Men's+Steel+Toe+Work+Safety+Shoes&quantity_1=1&amount_1=36&item_number_1=32998917949&item_name_2=ãReady+stockã2020++Black+Driving+Mens+Loafers+Moccasins+Breathable+Slip+onShoes&quantity_2=1&amount_2=32&item_number_2=32964786330&bn=WooThemes_Cart
这段就是我们发送给PAYPAL请求付款的几个参数了。
为了好看点,我把这段URL的请求参数转为JSON格式
可以看到,数据把商家的邮箱,就说PAYPAL收款账号,产品名称,用户信息,价格,数量都发到paypal的网关上了。
因为这些参数都是可控的,我们可以做个中间件,或者说俗点,就是中间跳转站,来获取并且修改成我们要返回给PAYPAL的数据。
那么如何获取客户是否付款成功,然后依此来实现账号根据收款次数和收款的金额进行账号轮询收款呢?
这里PAYPAL的返回数据的介绍,大家可以参考下
https://blog.csdn.net/zxl646801924/article/details/80454449
paypal支付交易成功后返回的对象中就有交易信息(包括支付交易ID,支付金额,支付人信息,收款人信息等),同时如果你开启了消息通知paypal会同时给你推送一条差不多内容的交易信息。
我们在调paypal支付接口(execute)接口支付成功或者失败paypal返回的数据。
id:为本次的数据ID,唯一。
payer:付款人的信息。
transations:支付交易信息。
transations.amount:支付金额信息,总价,税费,运费等。
transations.item_list:商品信息。
transations.shipping_address:收货地址信息。
transations.related_resources:里面就是收款人的信息。
transations.related_resources.state:这个状态就是收款人的交易状态,只要是completed就表示我们收到了钱,钱到账了就什么都好说了,交易成功。
{ "id": "PAY-1BV5911839643144YKSCUA7Q", "create_time": "2014-12-08T06:09:02Z", "update_time": "2014-12-08T06:10:51Z", "state": "approved", "intent": "sale", "payer": { "payment_method": "paypal", "payer_info": { "email": "[email protected]", "first_name": "Test", "last_name": "Buyer", "payer_id": "JARYJK2TES6C6", "shipping_address": { "line1": "NO 1 Nan Jin Road", "city": "Shanghai", "state": "Shanghai", "postal_code": "200000", "country_code": "CN", "recipient_name": "Buyer Test"
}
}
}, "transactions": [
{ "amount": { "total": "20.00", "currency": "USD", "details": { "subtotal": "17.50", "tax": "1.30", "shipping": "1.20"
}
}, "description": "Payment description", "item_list": { "items": [
{ "name": "Ground Coffee 40 oz", "price": "7.50", "currency": "USD", "quantity": "1"
},
{ "name": "Granola bars", "price": "2.00", "currency": "USD", "quantity": "5"
}
], "shipping_address": { "recipient_name": "Buyer Test", "line1": "NO 1 Nan Jin Road", "city": "Shanghai", "state": "Shanghai", "postal_code": "200000", "country_code": "CN"
}
}, "related_resources": [
{ "sale": { "id": "74V52932AB811673C", "create_time": "2014-12-08T06:09:02Z", "update_time": "2014-12-08T06:10:51Z", "amount": { "total": "20.00", "currency": "USD"
}, "payment_mode": "INSTANT_TRANSFER", "state": "completed", "protection_eligibility": "ELIGIBLE", "protection_eligibility_type": "ITEM_NOT_RECEIVED_ELIGIBLE,UNAUTHORIZED_PAYMENT_ELIGIBLE", "parent_payment": "PAY-1BV5911839643144YKSCUA7Q", "links": [
{ "href": "https://api.sandbox.paypal.com/v1/payments/sale/74V52932AB811673C", "rel": "self", "method": "GET"
},
{ "href": "https://api.sandbox.paypal.com/v1/payments/sale/74V52932AB811673C/refund", "rel": "refund", "method": "POST"
},
{ "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-1BV5911839643144YKSCUA7Q", "rel": "parent_payment", "method": "GET"
}
]
}
}
]
}
], "links": [
{ "href": "https://api.sandbox.paypal.com/v1/payments/payment/PAY-1BV5911839643144YKSCUA7Q", "rel": "self", "method": "GET"
}
]
}
支付成功后paypal会同时往我们卖家账号那里配置的消息通知url推送一条消息数据,数据和支付成功大致一样。
由于paypal推送消息不止一次,正常情况下如果是 completed并且用户收到信息就不会再推了,如果推送失败或者交易状态发生改变,比如出现资金冻结,发起退款等事情的时候,paypal的就会有多次推送了,那么我们要怎样判断是第一次推送还是多次推送呢?
查看数据我们发现数据中有交易号txn_id,如果出现多次推送就会多出一个属性parent_txn_id,这个就是原始交易ID,所以我们可以判断有没有这个属性,这个属性有没有值来确定是第一次还是第二次推送。
array ( 'act' => 'ipn', 'mc_gross' => '20.00', 'invoice' => '548531d624f59', 'protection_eligibility' => 'Eligible', 'address_status' => 'unconfirmed', 'item_number1' => '', 'tax' => '1.30', 'item_number2' => '', 'payer_id' => 'JARYJK2TES6C6', 'address_street' => 'NO 1 Nan Jin Road', 'payment_date' => '21:04:35 Dec 07, 2014 PST', 'payment_status' => 'Completed', 'charset' => 'gb2312', 'address_zip' => '200000', 'mc_shipping' => '1.20', 'mc_handling' => '0.00', 'first_name' => 'Test', 'mc_fee' => '0.98', 'address_country_code' => 'CN', 'address_name' => 'Buyer Test', 'notify_version' => '3.8', 'custom' => '', 'payer_status' => 'unverified', 'address_country' => 'China', 'num_cart_items' => '2', 'mc_handling1' => '0.00', 'mc_handling2' => '0.00', 'address_city' => 'Shanghai', 'verify_sign' => 'AomRS5l2W2xlt2An.GaSrAzpCl-NACIvh3Pz0HtrSBZzfcIeqDPGrXSk', 'payer_email' => '[email protected]', 'mc_shipping1' => '0.00', 'mc_shipping2' => '0.00', 'tax1' => '0.00', 'tax2' => '0.00', 'txn_id' => '5CS19517SJ894934R', 'payment_type' => 'instant', 'last_name' => 'Buyer', 'address_state' => 'Shanghai', 'item_name1' => 'Ground Coffee 40 oz', 'receiver_email' => '[email protected]', 'item_name2' => 'Granola bars', 'payment_fee' => '0.98', 'quantity1' => '1', 'quantity2' => '5', 'receiver_id' => '937CP9PSMDS2A', 'txn_type' => 'cart', 'mc_gross_1' => '7.50', 'mc_currency' => 'USD', 'mc_gross_2' => '10.00', 'residence_country' => 'CN', 'test_ipn' => '1', 'transaction_subject' => '', 'payment_gross' => '20.00', 'ipn_track_id' => 'a9059421a1dd7',)
同时服务器会收到ipn消息
同时服务器会收到ipn消息
同时服务器会收到ipn消息
对应这个notify_url
这个结果测试怎么出来呢?
创建PayPal沙盒模式并测试支付流程
https://blog.csdn.net/Strongermans/article/details/80271884
以下是我这边抓取到的ipn测试返回的数据
我们格式化下
可以看到,状态,金额,付款人邮箱,手续费等,都有在返回的数据里。
那么我们就可以根据这些进行比对,然后再通过中间平台进行调配!