私はしばらく前にAlipayのQRコードの支払いを勉強しています。 Alipayの文書は本当に悪いと言わざるを得ません(少なくとも私が最初に読んだのはMengbiからでした)。ドキュメントの上の例は、デモの例とはまったく異なるように見えます。多くの場合、ドキュメントの上の例は非常に簡単ですが、デモのコードは非常に複雑であるため、最初に使用するコードがわかりませんでした。その後、デモパッケージのコードを注意深く調べて、ドキュメントの例のインターフェイスも呼び出されていることがわかりました。そうして初めて、それらは同じものであることに気づきましたが、デモはドキュメントのインターフェイスのみを巻き付けました。
まず、会社のAlipayアカウントを申請します。このアカウントにはPIDがあり、このアカウントにアプリケーションを追加する必要があります。各アプリケーションにはAPPIDと、公開および秘密鍵があります。パブリックキーとプライベートキーは、Alipayが提供するツールを介して生成できます。さらに、Java開発者はPKCS6形式でプライベートキーを使用する必要があります。アプリケーションがスキャン機能を使用する必要がある場合、契約書に署名する必要があるアプリケーションに対面支払いのオプションを追加する必要があります。対面支払い機能に署名した後、アプリケーションを使用する前にオンラインである必要があるため、直接使用できません。したがって、開発中にアプリケーションのサンドボックスバージョンを使用できます。 Alipayは、構成中に変更する必要があるゲートウェイ、Alipay公開キー、PID、APPIDのサンドボックスバージョンを提供しています。
コードは、デモでコードを直接使用し、最初にプロジェクトでAlipayが提供するAPIをインポートし(デモコードではないことに注意してください)、図に示すようにデモコードをインポートできます。
このcom.alipay.demo.trade.mainファイルは直接実行できますが、リソースファイルを構成する必要があります。
#Alipay Gateway Name、PartnerID、Appidサンドボックス環境のappidappidで直接こちら= 2016082000300485#RSA秘密鍵、公開キー、アリパイ公開キーmiiceqibadanbgkkhkig9w0baqefaascammwggjfageaaogbamkxzrfr+rnvygbs9qz2ce1mcsibreaqan+5pf5+02hyj4hzcnttwqhfm91ih 3wypyhpm7xlbgj5ywjtgc4g1lz75r8a+ucyuxp8by1lv/44gi/tiflsgatfq73ocm9imxocrdyz2zcwqi1gv+b3udoy/da5w07grwizs6vq 1ragmbaaecgyeaqhhc4grbsrckeynytk1vhqcj0yg11lvy85z3si0fny26dvs8r5gfydzc/mx5f8rnpuuyuhqn+4cqor3d/c291x1itov2nev lhejroudknp4oqriqt2w9pz8rzwzp2jcwvrvuf4ztpeimppmorp6sprfx6dlzg29sfi6gzwu6tkcqqqdp3mim1bhus3yonezgqcc69zn0/dgofk Eix0S18QAU1X4I1FEJVTKY4HPDWIHPGYAJM0UFG1LK8MTIUNHPZRCNAKEA1QF6U1AKJM6ZSVDENRXEDTCC75UVJGSYFJWHHX9PJYD9VX8NSZV 0Z0U4V0ZG0N0YVHJ5LRO6U5FCQFCFRW1WIXNQJBALMCKZ8SVF/H9N6LIWMSPY6W5Q82KNRLRC7WSCENSPQT0WQL5+SACG98M0XXY5J1HMIOLHXG ctvyrixowobivqccqccctnanb4uz3q/86r/kukbvd3dirwlfryaho6yxp8oy+je/bv/359+vr3cxzyyylzhzor9/tvspwr/y9q4jlem Q1TakeAlbu7+4EDZFAP7E/FMGYKD5DML8H2IAEUMRRCPL84GHFFK/7PSQ/40NGKXPTGY4NLELHXCRPW5CZU6GQDINJOA ==# Merchant public_keyをこちらに記入してください= migfma0gcsqgsibdqebaquaa4gnadcbiqkbgqdcl2axufq572iabpas9nbnzgkiauxmqmp/ut3+ftnh8o+b83du01qhxzzvdsbsb98gd8oato15w4 ceclibyauinzc ++ a/gvlasrst/g8ts1f+obov0y0oae30o9zndpypl6hexwm9mqskotyffm91a6mvw2ucno4evosxc0ulatawidaqab#thisサンドボックス環境の公開鍵alipay_public_key = migfma0gcsqgsib3dqebaquaa4gnadcbiqkkbgqdighnon7llillketd6bfrj0gs2y3mn1wmqmyh9zeywlz5p1zrahrahbxafcfsqshnfq OMAQZSHRVJCQJSAW1JYQRXAPDKBMR90DIPIXMIYKXV4GGAKPYJ/6FTFY99UHPIQ0Q00Q0Q00Q00Q00Q00Q00Q00Q00Q00Q000ATVP/65ZI3E3EEOF7TCZ32OWPWIDAQAB#クエリの最大数とクエリ間隔(ミリ秒)max_query_retry = 5 query_duration = 5000#元に戻すと元に戻す間隔の最大数(ms)max_cancel_retry = 3cancel_duration
次に、main.javaファイルを実行します。実際のアプリケーションのスキャンコードの支払いコードについては、main.javaファイルにtest_trade_precreate()関数を直接コピーして、コントローラーに関数を作成できます。
@RequestMapping(value = "/pay/alipay"、method = requestmethod.post)public map <string、string> alipay(@requestparam string on bult、 @requestparam int userid){map <string、string> map = new hashmap <string、string>(); //(必須)Merchant Webサイトの注文システムの一意の注文番号は、64文字のみで、文字、数字、およびアンダースコアのみを含めることができます。 //マーチャントシステムを繰り返すことができないことを確認する必要があります。データベースシーケンス、String Outtradeno = "xxxxx" + system.currenttimemillis() +(long)(math.random() * 10000000l); //(必須)注文タイトル、ユーザーの支払い目的を大まかに説明します。たとえば、「XXXブランドXXXストアが直接支払い、コードをスキャンして「文字列件名= "Pay"を消費します。 //(必須)注文の総額は1億人民元であり、1億人民元を超えることはできません//(オプション)注文は割引金額を変更することはできず、商人プラットフォームで構成することができます。アルコールが割引に関与しない場合、対応する金額はこのフィールドで埋められます//値が送信されないが、[総注文額]と[割引額]が送信されます。 //販売者のAlipayアカウントIDは、契約アカウントの下で異なる支払いアカウントへの支払いをサポートするために使用されます(SellerIDに対応するAlipayアカウントへの支払い) //注文説明、「合計15.00元の2つのアイテムの2つの購入」を記入するなど、詳細な方法でトランザクションまたは製品を記述できます。 //マーチャントオペレーター番号、このパラメーターを追加して、商人オペレーターの販売統計を行うString operatorId = "test_operator_id"; //(必須)マーチャントストア番号は、ストア番号とマーチャントバックエンドを介して、割引情報を正確に構成できます。詳細については、Alipay Technical Support String StoreID = "2088102172329883"をご覧ください。 //ビジネス拡張パラメーター、現在、Alipayが割り当てたシステムプロバイダー番号を追加できます(SetSysServiceProviderIDメソッドを介して)。詳細については、Alipay Technical Support ExtendParams = new ExtendParams()をご覧ください。 extendParams.SetsysSersiviceProviderid( "2088100200300400500"); // 120分間の文字列Timeoutexpress = Timeout; // //製品の詳細リストとして定義されている支払いタイムアウト、購入製品の詳細を入力する必要があります。製品カテゴリを追加する必要がある場合は、goodsdetailを参照してください// goodsdetail goods1 = goodsdetail.newinstance( "goods_id001"、 "xxx smallパン"、1000、1);ユーザーが購入した製品は「黒い歯ブラシ」で、単価は5.00元です。 2つのピースを購入しました// goodsdetail goods2 = goodsdetail.newinstance( "goods_id002"、 "xxx歯ブラシ"、500、2); // goodsdetaillist.add(goods2); //リクエストビルダーを支払うスキャンコードを作成し、リクエストパラメーターを設定し、AlipaytradepRecreaterequestBuilder Builder = new AlipaytradeprecreateReaterequestBuilder().Setsubject(subject).settotalamount(totalamount).setouttradeno(outtradeno).tesundiscountiscountrademount(auttradeno)(descountiscountiscountablademount(decountiscountisctradeno)。 .setbody(body).setoperatorId(operatorId).setstoreId(storeid).setextendparams(extendparams).settimeoutexpress(timeoutexpress(timeoutexpress).setNotifyurl( "http://xxx.xx.xxx.xxx:8080/baobiao/notife")マーチャントサーバーで指定されたHTTPパス。必要に応じて設定します。ここで、自分で書いたインターフェイスを設定します。後で紹介します。 // .setGoodSdetaillist(goodsdetaillist); alipayf2fprecreateresult result = tradeservice.tradeprecreate(ビルダー); switch(result.getTradestatus()){case success:log.info( "alipayが事前注文された:)"); system.out.println( "Alipayが事前注文された:)"); Alipaytradeprecreateresponse response = result.getResponse(); // dumpreSponse(response); // System.out.println(response.getBody()); // // //ランニングマシンのパスに変更する必要があります// string filepath = string.format( "/users/qr-%s.pno log.info( "filepath:" + filepath); // zxingutils.getqrcodeimge(response.getQrcode()、256、filepath); //注文を生成してデータベースを挿入baobiaOorder注文= new baobiaOorder(userId、outtradeno ""、double.parsedouble(ant 'lument)、new date()、1); baobiaoorderservice.insertorder(注文); map.put( "status"、 "true"); map.put( "qrcode"、respons.getQrcode()); //クライアントQRコードMap.putに戻る( "outtradeno"、outtradeno);マップを返します。ケースが失敗した:log.Error( "Alipay Pre-Order failed !!!"); System.out.println( "Alipay Pre-Order failed !!!"); System.out.println(result.getResponse()。getBody());壊す;ケース不明:log.Error( "システム例外、予約注文ステータス不明!!!"); System.out.println( "システム例外、予約注文ステータス不明!!!");壊す;デフォルト:log.Error( "サポートされていないトランザクションステータス、トランザクションリターンズ例外!!!"); system.out.println( "サポートされていないトランザクションステータス、トランザクションリターンズ例外!!!");壊す; } map.put( "status"、 "false"); map.put( "msg"、 "システムには例外があります。後でもう一度やり直してください!");マップを返します。 }ロジックは、ユーザーが携帯電話のコードをスキャンしてAlipayを支払うことです。その後、Alipayがそれを受け取った後、以下に示すようにnotify_urlを設定するために支払いの成功のメッセージを送信します。
@RequestMapping(value = "/pay/notify"、method = requestmethod.post)public string notifyResult(httpservletrequest request、httpservletresponse response){log.info( "Alipayの非同期通知!"); map <string、string> params = new hashmap <string、string>(); //すべてのパラメーターを取得して、署名列挙<string> parameternames = request.getParameternames()を確認します。 while(parameternames.hasmoreElements()){string parametername = parameternames.nextelement(); params.put(parametername、request.getParameter(parametername)); } boolean Signverified; try {signverified = alipaysignature.rsacheckv1(params、configs.getalipaypublickey()、 "utf-8"); } catch(alipayapiexception e){e.printstacktrace(); 「失敗」を返します。 } if(signverified){string outtradeno = paramseg( "out_trade_no"); log.info(outtradeno + "Order Callback Notification。"); // System.out.println( "署名を正常に検証!"); log.info( "署名を正常に検証!"); //パラメーターのAPPIDがAPPIDに入力された場合、それは例外通知です。 「失敗」を返します。 } //データベースの注文番号に対応する順序を見つけ、その金額をデータベースの金額と比較します。一致しない場合は、BaobiaOorder Order = baobiaoorderservice.findorderbyouttradeno(outtradeno)の例外も通知します。 if(order == null){log.warn(outtradeno + "チェックせずにこの注文を確認!"); 「失敗」を返します。 } if(order.getamount()!= double.parsedouble(params.get( "total_amount"))){log.warn( "支払い時の金額とは異なり、これは例外通知であり、無視する必要があります!"); 「失敗」を返します。 } if(order.getStatus()== baobiaoorder.trade_success)return "success"; //注文が正常に支払われた場合、この通知文字列ステータス= paramseg( "trade_status")を無視してください。 if(status.equals( "wait_buyer_pay")){//ステータスがユーザーの支払いを待っている場合if(order.getStatus()!= baobiaoorder.wait_buyer_pay)baobiaOderervice.modifytradestatus(baobiaoorder.wait_buyer_pay、outtradeno、outtradeno); } else if(status.equals( "trade_closed")){//ステータスが未払いのトランザクションタイムアウトが閉じられている場合、または支払いが完全に返金された場合(order.getStatus()!= baobiaOorder.trade_closed)baobiaOorderservice.ModifyTradestatus(BaobiaOordeStatus(auttrade_closed); } else if(status.equals( "trade_success")|| status.equals( "trade_finished")){//ステータスが正常に支払われている場合(Order.getStatus()!= baobiaoorder.trade_succes) } else {baobiaoorderservice.modifytradestatus(baobiaoorder.unknown_state、outtradeno); } log.info(outtradeno + "注文のステータスが" + statusに変更されました); } else {//検証署名が渡されない場合、「failed」。 }「成功」を返します。 }これはおそらくそうですが、クライアントへの支払いの成功の通知が少なく、セキュリティの問題もいくつかあります。
最後に、このプロセスで発生した問題を要約しましょう。
1. Alipayによって返されたQRコードは、ブラウザで直接開くことはできませんが、QRコードを変換してQRコードを生成するために使用する必要があります。または、CLI.IM Webサイトで表示できます。
2。Alipay Sandbox環境によって生成されたQRコードは、Alipay携帯電話のSandboxバージョンを使用してのみスキャンできます。 Alipayスキャンの通常のバージョンの場合、QRコードが期限切れになり、他のエラーが発生します。
3.支払い後にAlipayから送信された非同期通知を受け取ることができない場合は、郵便配達員やその他のツールを使用して、記入したNotify_urlにパブリックIPを使用してアクセスできるかどうかを確認できます。
4. ISV許可が不十分な問題に遭遇した場合、契約署名がないか、アプリケーションが対応する機能が追加されておらず、オンラインなしではアプリケーションを使用できないためです。開発中にサンドボックスアプリケーションを選択できます。
5. Alipay携帯電話のサンドボックスバージョンを登録する場合、カスタマーサービスに連絡してアカウントを求めることができます
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。