上篇说到微信公众账号的几个坑,前面五个,已经说到菜单,宝宝继续往下赘述了。可惜,还不知道宝宝的宝宝到底是不是心疼宝宝呢,完了,我凌乱了。。。
回到正题,我们就不吐槽其他的了,上一篇说到微信的菜单了,那么,我们现在说说菜单回复等等的吧。
菜单回复是需要处理XML文件的,我们根据微信返回的XML文件,可以得到每个微信用户相对于微信公众号的唯一标识。微信公众平台的机制简单的将就是我们自己输出固定格式的xml文件,然后微信APP负责解析,得到我们想要的信息,然后对信息统一处理。
第六坑,如果你看微信文档,那么,绝对坑死你,上图。这里的ToUserName和FromUserName一定特么的要分清楚了,记住,千万不要写反了,用户对于微信而言是A→B,那么微信对于用户就是反着来的,貌似现在应该说清楚了。
aaarticlea/png;base64,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*gP5RcaDszDYQ3s5ejm3q2kB2gsliQrLzGuaakBBCmeyfm9XZ0C2QDOYRF0ttI/b8NBdk5vt4OVOfjhNOLdYJh4kzcrLTvBWHKVNozJrM0RRWPm3/ybMOagpeD5CxUfInKEZBXBd6Ox2U7PQF77LahPy9pCNspZ6Jq1fYQG3ip+1mvRJnFZpBtqq8Rlv4szrT8Ef7yrMrRfoDzk8yGHn2PhZkGyWetqpd9HUbSxkE/iWfLJfhYO+Z7zNyJ16QARFHOsDb2Xaz7vRm8cqTy0zG9gFU408YJnpZaxbUvJBzbTWK6O7uYRmYB+P9JT2yqoCW7OzaKz5pRjwsGdk52jivfm7KY5lycnd69CRaAmnxWC0eV9ED65bnmr6XkJ1fZT4ShaoK3uCqNsP3ar+CUbH0SKGuRIv1Kpp99pu4e0CLY5u6NpCdYLKYjuy8bGddwHZKlhFTlXz9d8LbmZGd3RQSHjWR3oAaW72pQ1m/ByccmpshB03z5syqF4yjczV8hYTZzoeQGYlYsjNwOg26hUsnVc9d03j7QHs7g7aWVZdwlcR3T7gjfL+Ng7h8c5uys8BDWObtDG6hDjjpC9zq208bV/uHZGe/g849ud3+q9az8bh9ljv0VKHCh1cdMqz7tg7hi50MXTr7TbU6NBvCzXyKlxtl7dGk4Zis+W4MjHVOp3+MIMbAEWcFF/TXfNdkD4swUFx0hoKXYYQ9Vu++E9kLx7HEeU6ZriUXZVz2ojoPTv1JyM7xx/lmAaurkIQ3Pqg0/ZAGT4fhuw69uPLWVSeMs0cKfZn5qC1UieyMOl5ywa5kVCz1duqjKJyJ8hRm2+SlZy5OkGObujaQnWCymJbsDKGdWgVsZgt1LIE7baUN+JSGVEGQrbfzlDnS2E+byCJJbVCMT34Pi5leBR80zRuHfyQ8imFoqzXPXSw7hfWfTLzkFiJ7skt09ZD0dkYpBFtPA6aq1NCHi8BzHvXbxdN2ozZeDvd2vqyq6mGzjpRw0Um2Kkvpus0fBGLYfJ/l7Yw6RljbUh+GG1w77RoZke604V5bzVurF+ztLDoWK9PZFt3BKrrq1HEpfvObpYgia3tAzatdl77zt2eDS1dYGcVwZAaziNgHYYv3e0GT3s4G0vmvo16bpYf7G+eDY5Dj7iTiS2X/9z/x94r3o3pBK0NFgvOQSk+y/RLzka/PICI37n7mt/ZMUTgq9p10lVpSDJB70PKj97w4tqlrA9kJJovpyM70CPv2Is8IzdKdU6rfRKdPagl3s+S8nc1MJpbh44nKbUeMF9qVIFG3GO7tTDhe2vnpfy86/6YKI82cBTZQE/oJ0twSs9rEL1JP79pNWhJiGrZUmTawUgmqK11V9211E6GSSevBNKe6uhXFj12RYW3HMsDfN78vy9vQ+tCL0L9k1nD+6JqULgqjnYvw+L/9n0OOKXKF8tvq1ObD4HyRtorilupOb9oflLM0V59tnXtdJ1epWkQ1k/kqVb29Dr1EeJ7ofj3+kFZpDDsgSrrUug+DLKlY5Ty6p0D78eJHqdtTEJc0Wbrw7JZK+6vbXhf3fNPbOe44r71eZrJtynEgd4eueg/B4b3KQ67kSridoez05vufj4wFILNoKa+4XfbCUfF7ciFbwUffmJlRebYFMEcQtRzb1LWB7ASTxQxkZzfOfjgEF0LYcGi0JKTmIYT9vMjbOYiMIYJjm7o2kJ1gspiN7IQQQgghhLDl2KauDWQnmCyQnRBCCCGEcG4c29S1gewEkwWyE0IIIYQQzo1jm7o2kJ1gskB2QgghhBDCuXFsU9cGshNMFshOCCGEEEI4N45t6tpAdoLJAtkJIYQQQgjnxrFNXRvITjBZIDshhBBCCOHcOLapawPZCSYLZCeEEEIIIZwbxzZ1bSA7wWSB7IQQQgghhHPj2KauDWQnmCyQnRBCCCGEcG4c29S1gewEkwWyE0IIIYQQzo1jm7o2kJ1gskB2QgghhBDCuXFsU9cGshNMFshOCCGEEEI4N45t6tpAdoLJAtkJIYQQQgjnxrFNXRvITjBZIDshhBBCCOHcOLapawPZCSYLZCeEEEIIIZwbxzZ1bcxedp53y6o+uj+Xu7P70H3a4FirD4511V4aJvL+fqzd3/4vdcV5t1RpG2mUQKR+STK+tDLFXoi0z7tlFSZxV0B2QgghhBDCuXFsU9fG3GWnFF+BjjvWlVJVWnl6eRcIvfP5uFu6X3a/8Rcd66qqd2d/zwzyos4QjpbsPO+WlnK0ZWf2jirtKNmsRB0FyE4IIYQQQjg3jm3q2pi57JTay1Rx4dX1MaMU/c8jUeo+CF2UGaXXJwJljhN5yv3+Q7Kz1ZwJXTnYcXsjIDshhBBCCOHcOLapa2OKsvPXn0/fGpx+/jV/aUlYac5rFwe6BkK2T6Be6O1UP2uksIgPro/vOQ1p3XO5O4ufxBlXLttjXS13x7y3E9mZweiDEYQQQgghnCrHNnVtTE52es1ZqDwdjnXG0+eUWiimDNl53tVCpllpSkH4IW+nv4MhO/sgknd/Stkpbt0lGQXZ4u28DKMPRhBCCCGEcKoc29S1MTXZGarOb9++/fRLwe9Sjslgc2cbLtvnnWz1W5nszKBkb+d5t1zudlYyfi+p9c01ZGcGyM4MRh+MIIQQQgjhVDm2qWtjarLzl59C1Vnk7zzvlvVuV2uVF7objaNj7dNkRap9erLQ2ym1Y6gmnYasay0KVbqRAtYn+AZxuSWys8vXPQhMG8hOCCH8WjyscwuaVVVV6/3omYQQwjvn2KaujanJzsu8nW2ArYqzjRVVpDE76be09ertvJ3H2vk5j7tlVR+bJH3CxslFgToUmbhUdmbzfg9idDKys98OE9bYYV1tXr7/OH//cdouqtVBJvWyylhsh3W1eHpNfPv6/PjwfIpyFaa23/TnUmTptF1UYbJ93G8qV8A+vj09pEs0hKft4nH71t69y79RJz/O+40skV3A1+fHrjYenk/yn1YtNQ0XfNLXSTYvza/C7vH29FDel+L6rKzKD9Ns6ypRJyLDLqnX58dUm4rfZnuv3YF9DcgM7DfVw/PTKixylP+3p4fgjlGPCtpu9WxXb0/bJfj6/GiVKKxes/9YZbl2u7se3pbOV85pu7Cvl49MlO2wXKk6F7e2+0NzF7vX9dA/6WZty8ff7tjWKPr6/Bh3gFSfzw+hBR2prRaR1cI2CgaZoOxqNvGJJ55is8jGA9VD+5HPDBfZ1uyv3qiSi2aom9RG+208iUNYzLFNXRtTk52X7O00Xq9pvpJSarfGkSlf8+mvVzLNxlX2dur3jLpsqwOGgguVLo3zW3qk0LuTnMu6jurpWFf3ITonJDvzDAwdMfNFE5uYxQvNUJeyJbGMGbHP1FM/yZrLDVJGcMJCbWypNIabob7s+83j9q21MNzfcTZeVtXjatMjAzqLpKmuyIqKbd9canE3cAkKwzFn4iRFQtjNqrYGMssTpi76gOz0qfXZmq2BqM1Ks58YOTSfF+OOCQnknw6fgr9LoFWG0VV71xNMAZPo2IbZfeV2lxUiR54w571ZddVVusTmLs41x0Ume5Bt36CGAnEdO/2EttlrGy434rmCZHpLUUdq60Q/+6VtpDuYLrsUY6+Hpwc3nHbrgP55Oayrar19O3XZziA/JpsdJn4wo4rtsl02FumHYuAMdZPaEGM4vn14Kcc2dW1MTna+DzrJ9j12BAYaMr6yUVyRsDJ8gn3eztahKs4FUimb2lff0atE9ytD9bVOXKcl23fA+Gu6f5V6O/UbTd3LVHbmS1XOu6V4U6jx5w2B7Axn2St4O5Oz5uLpdcik3s7oCatXGBY9SlLP1trO0CIhbfLmKCWiwOP2TWbMC4ySW/TJzkAuVg+Lx0iBv6yC2iv0dprt3mPZNCX11+w3VWStdt++rKr13l7UeNy+iUZJewZ8Hfo+mbLsM7ralpc5+aoT0S3ufMX9stPAQPGTWWjwkBbqJbLzCu0eei/TnT96igu8uL5R0uOSGftw2ZMe9JBCifiwWKtsp0ZR00+e8HYq4Sd+VSI72yFIL0KVtZG74+YlI/79zyNRmlJKmVGxf8D0NZB4KHJLYB+SncUz1E1qo23rYJkAwkEc29S1MUXZOQBSfzlZ1h4GVGld5CJKSw6XFV7QtOz0ysu4rOA1KN3v/A2PdVVV7flC8VtclCMzKFroDE0XLdKKcahtrOKRnRqXjCCx+nITalZ2GpJAJDs8PM85GRLKtvs7Tnl1OPtJ/bCuFk/7/Fqyl50Zj01bipvJztN28/Rq+ldd4r74h7UrZlKcK4OmqqpKyk7RxG3ZI/0plH9ogKa8nc/rh+dT2tvZE75r36vrFbEXxTK7laWVlZ2vz4/CM/CyqkR3Cvy38dMR2mfmxT5Nwy8qa8n8++3pYbFeRbGdN/N2hv66pPOn9ym+TbuXhCxW2oHc4+3sWjMDHRrw+pbPxjWcRYb0PW0X69WmzU8qA1FhkwsKod6w7ntZRxraRiFj5SNzlY6akSXKIDkmK+m73luBD2kJZ9WzHq6vNkN9Tm1AeAHHNnVtzFp2tjKrFU6x4vKvTelcoj0v+qyP0kUZOw1bBLeygnF75a06ybYRsfI3sXDWhVa39ZG3vRCyUX5gVVtJGW6KqcnOxKajHtkpaK24F1iBxpXdP4NFXzmpB1sc1aTuEinzdirpJZSbt0KE7Mz13ssm9dajIs2gxiJxdszq0NbYQ1lQX5+3M0Fv0xRY0noTV2Z9vSmO7Z9paixlS21exK4/v8bv4ht9/0nKzhaPq43zL+llgspnINRyik1SBbLTp6mMeHelkJoqM12e354eqseHRZV0+o0kO4d6O6/X7qK2C/ZRq6wmtwTrUkeLR2KFImyI4Jqh7KRI2F6x7Hx7elg8bTdVF37vu2JwpevnQZpF3k6d2oeitXvbKJFPS3aetpsq7/831yLNwvaOya7PlMfbi/JGs+T1Z6jPrQ0IB3BsU9fGrGUn0LjI23nHQHYGjL4q95O0k3RuR2i7AWzYpJ5BHEFqOBwsO6njVY4UsraoNV7Q7aY58qH1ADcbC7timvCaOZCd1pXh574scfRsUVhmFfu6F0+vTf/pD7nso5Nk/nQNGYvY6+0MWtxFFzf1I/Rh1Enenh6ccNVZimTn29NDtV5tCmRn28+jdQ2tmVuviGy1qx4pdCPZeeV2ly0YQQYCaDxuD5mzgrK92Dd0Qld/KDRRDVYmuujHtmP3jYqus+UfUmuRIoor+Yjs7GkjcYvSAOOm7AVCK4OSvZ2vz4+JM8C6JZ4IQXDExbIzg3i99ca1AeEwjm3q2kB2gskC2akZL6YO8nbqidYO0hs0qWfS8bQdWeFNmxooOAGiJ17XqofKhxZr4+D1+XH1HO4GvNTbudZBhgljukhFv6yqyimKdH46vdElG7mwysLzlFdTaBjf1uVBtjJ7ztw86aJFNXNY+51UeQHw+/Xq4DOTk53q7trfHrtAr+3tLOjGquaHyc4btHsTcbp91rsczcYKQpdlf04dYJPwdsoCBjW22hQ+KSatg4j65ITVBKr4XR8wPFrRjmJ5YGwlmuZjsrOojYxb5DV8WVhp4W5G34LBVgWnIdXqUtgoUW8Pghd0XO7VZqjb1AaEV+DYpq4NZCeYLJCdymK49NULTm61J1Uk0Z7aP2RSzy7/C1un0CtrHPOg7JL0sSUpHtargzhj04lb5cOx3BEJw10EiTl0QbYqWblnMoewjbqGkFkyvpIu3CiQzxbnBaI3/G1zPMllstN93i87kynYF0vZGdZksAO2yWpCambzeVFnMxha0h/d23mbdm9UehDDGR720zR3XnbKd3tkkPB2Gk7pC+v8EtmZr/y+kcGUnaHQ+uCRyP1tZNyiG6Ifbb16O/+eX/p52S4qNw6nV3NieWxsd7/RDHX72oDwAo5t6tpAdoLJYmqyM2HTmLIzOPGl+/k19nbqX4WL+kUHNvzo4mbXK+u1BLnAv7RNeX3ZKX/lzJqm+Ptn/ZYCl/POuIwMRLU3qVM+Ym9naFfFHSD3Ftbik2ybY3vUD+N9a7GVqUJ8rdZp3GgfO1IoSN+SnRqRWZnpw0FmjDaKDl4KT9bpk51JBXhZzGeUn48E2d6q3cPXMq33wc5Y2UByf3JQmSmvWk5DtgXcb9qbunromr7/QDIrzeYlSRl1EJ5cfUVvp+p7zYbn5BFx5Sxqo+/6oZAbocMJJQxHN3AV/14cR9BWSNh7u4ZWulTOWbHsvNoM9Vm1AeEwjm3q2kB2gsliarIzYT/pCdg6aeO0XTQWQ3jg5+C9nT+Cg23CAKTStWS9YdJF8D717NVsmJedPUjXYdKYa+0YabhUnZeySno7M7JTKh91pNBhXSUWvC0bMZKd5km2wftFzCNP+t2YunLst5WkotRysrMx4LbPduzcTb2ddtdS5Yo2D6dlp7Bce7Ja1uvsrF4uO2/V7lFXDxe8/GWt1FQHa8d2f8mrO1U4+sOiCsMQfNW5ZyR1Xo5daf7dvPl2H+jtbDaEmyUKarUbsa2ltOGys7CN/JWJrQ3qPKf4HFerZlqHqjj3W6VsHhJu9W1ZD8a6ZOvLdaur7Qlw+t0/g7ydQ2aoT6sNmwP6NpwZxzZ1bSA7wWQxKdmZpjIfw2NLI2mklOdl3k6fTgMdtZVdrzVf4B4HMmXtqvIIuuIrs0cjNlUR7VRs7T9V4WVBtl6rK9nZnNO7iZSncWpo3O4fe29ntpYMk3oReHp1r4vcVqHsFCl5pSEjw+9BdnYHukavr7QqJ/62X3bmD+TsdiwHP/n4kULXa3cVpSkXvJq/AxG+2qTqKsvcU+y2MQcZ9qqjkZ3qrRh9A4KQLn15KPZ2+vWLXm+n8jHGnaR0g7fuSEVt1I1avcpHPO/ZmvEOdvsNNP4M8NQdX/1Rdn7wrBaNeg+r131iHDUXrPTlizZwhvq82shleHjHgNPn2KauDWQnmCwmLTulUZhY5vRL5vrzl1W1/ofyY0u+tTpBn3CoXQGVfytaL6J3V5ome3eXsjNaB4fnKWY3Tb2smlM39dsChUHv/y7ydja5EkvUsXRxG+2ashv+N1mTLQu9nTHz9krrRkj8sHPSJl4FETZx8oAo1coyzG+g7Mz0ljYPCbu/RXQykJ1Du+sWnGha2OviTXdmhQw9fOj67d4KUVF1RgdY730Pye/bHDIuia10VoiHXnEb4BFKnIRULDt9t7fik+1tfp2vrIraPepUw5xaF7RRj7e5cVlbh2z9SEwQqXYvGJxf/Um2jWyLongS8clRbI4fonsxbIb69nm1kWxikW0IPcc2dW0gO8FkMWnZeZ+8aC15dF62XQrCj5BeB+Fn82vOUBBexLFNXRvITjBZIDshhBBCCOHcOLapawPZCSYLZCeEEEIIIZwbxzZ1bSA7wWSB7IQQQgghhHPj2KauDWQnmCyQnRBCCCGEcG4c29S1gewEkwWyE0IIIYQQzo1jm7o2kJ1gskB2QgghhBDCuXFsU9cGshNMFshOCCGEEEI4N45t6tpAdoLJAtkJIYQQQgjnxrFNXRvITjBZIDshhBBCCOHcOLapawPZCSYLZCeEEEIIIZwbxzZ1bSA7wWSB7IQQQgghhHPj2KauDWQnmCyQnRBCCCGEcG4c29S1gewEkwWyE0IIIYQQzo1jm7o2kJ1gskB2QgghhBDCuXFsU9cGshNMFshOCCGEEEI4N45t6tpAdoLJAtkJIYQQQgjnxrFNXRvITjBZIDshhBBCCOHcOLapawPZCSYLZCeEEEIIIZwbxzZ1bSA7wWSB7IQQQgghhHPj2KauDWQnmCyQnRBCCCGEcG4c29S1MXvZed4tq/ro/lzuzu5D92mDY60+ONZVe2mYyPv7sXZ/+7/UFefdUqVtpFECkfolyfjSyhR7IdI+75ZVmMRdAdkJIYQQQgjnxrFNXRtzl51SfAU67lhXSlVp5enlXSD0zufjbul+2f3GX3Ssq6renf09M8iLOkM4WrLzvFtaytGWndk7qrSjZLMSdRQgOyGEEEII4dw4tqlrY+ayU2ovU8WFV9fHjFL0P49EqfsgdFFmlF6fCJQ5TuQp9/sPyc5WcyZ05WDH7Y2A7IQQQgghhHPj2KaujSnKzl9/Pn1rcPr51/ylJWGlOa9dHOgaCNk+gXqht1P9rJHCIj64Pr7nNKR1z+XuLH4SZ1y5bI91tdwd895OZGcGF40gr8+Pbd0unl4vG4Penh6KfnvaLnJt+/B8Krksvnh1CLJx2i6qavOSzsnLqnrcviW+Paz7br7et4kUYPPy/e3pQX0U3nq/6YpTVPy2vFE7ikTC9NufHNZdtbw+P8q/jTTfnh7akvZQ59+sbYGgqzS1LRrL5/aj/e1llagr1e1FmwYfit++rJqq0HXSk9XDOvVM7Tf9HcdOubhRMhxY9qh9RS8SvLDf6hTWe1WrhU930NDB0y0Suf2zEHaYuOZz45LMszFKDOkzp+0i/1TerDbab1W1Z7pimMnDuooTD4fQCOaD1tNq1x9pZ93uOWYn3BT7J+IG670qSNzx7Eb53j9zwQTHNnVtTE52es1ZqDwdjnXG0+eUWiimDNl53tWVl2lWmlIQfsjb6e9gyM4+iOTdn1J2ilt3SUZBtng7L8MFw8fb00qKvaKpMWJghiZVlp5T1OdZ7wAAIABJREFUtXiw5vJw/jAmb5lIkI3DOhZ4jtEsmFYIZSLHF63PwjAm4Eh2ygtyNnSUsvnV6fXw9OCE+n7TtrLP52FdVevt26nLTAbWJN1rUlgXdJ0kqtvryc5c3nR/a+0S2XYqG133UIZXbM3o2+lOFSSeNXdyJnvXghdzWNnNh8WWnZf126C6xA8HPN268/tmCu5762chVclGH/CfxDZ0Qn6U95koWdNYv0ltuJ8nbf2+WrK6SlbwvD4/mqN331B89ZF2zu2eXVu8THbmGUzZcnwIe0uqK94gVzPh2KaujanJzlB1fvv27adfCn6XckwGmzvbcNkUAh1XJjszKNnbed4tl7udlYzfS2p9cw3ZmQGyM4MPDiXmMnMBw3lRqQI5jxZ6Ozv2y045x2cXoTN3f1xtHiulJQrgp+c8Or+o1ir24n1TUeXGUO9qvWjNyBBPWYcZK8d/1et8kBl4e3pIze6qq7QlbTTPfiNsl956ln6wXjgbq1x67TfV6jlaTDnIT5oC3kJ2FnTIgXEKg8refJ41PYf22+wwIiptyNN9/v729LB5yXQV//PrPguZ/LQFSbRgrtU+JD9a7ZFQXOEoeu3aaDuPvTaR7IrJDmYs91glEn2m72lJLINecaSdY7uL2jPWcD9XdoZ5FiUaNHPBFMc2dW1MTXb+8lOoOov8nefdst7taq3yQnejcXSsfZqsSDXxrAz1dkrtGKpJpyHrWotClW6kgPUJvkFcbons7PJ1DwLTxoRl50D7NbYVHp5PWdl5ZW9nSQCSNYV0s+DLKpynowky8q2pVWEveGJvp5jtuknRquRLg2yzpnxnVcj8pyddaTVmUOSaSOXE/Epqy8XTq9c8IlostjDkPwc4P3UjRp3Ell5SNouydK0mRNpg2RlbyV3Z7TSvwQFlN9v3VkG2IS99utP5vO2zIO6rsudbsKvktClvaRX3XBT1mcO6Wjzt8+qrqZbPqY0U36JVm4xyGCQ7S4NNrj3SzrrdQ9m5tX81dCiL2yghbsOHPVrqtVIeOiLBlmObujamJjsv83a2AbYqzjZWVJHG7KTf0tart/N2Hmvn5zzullV9bJL0CRsnFwXqUGTiUtmZzfs9iNFpys5c4FDfD70hvjp8qrdTZSOjPQavcXZGwOP28PSweHrtTApb//TJTrGi/PB8ChT4pUG2hbLztN1UVSxBBQNnRbmHJwhvsxvINBkDr9TiaS/8HkJxOXsuc5egUCmnvf683OO331SVITu7BYshnklLdgYrDn2yM4qpu0hyF5a9sXTbhzpRJtEbPxZkm2P26XZ9qV8e3/JZSNezIT/6yxuZ10P6TO5G/qvPrY2Cruj/mXbNJUp0oey86kg763a/kbcz3UY9slM3UFTGopkLpji2qWtjarLzkr2dxus1zVdSSu3WODLlaz799Uqm2bjK3k79nlGXbXXAUHCh0qVxfkuPFHp3knNZ11E9HevqPkTn1GSnW8u81KOitvI/bt/ysrPf21kQJWVkOPWr3NLyxUcoybL3IAhzfXzoTAQxa95WdspblBkZGYTR1HErxJO3qiV1vYik9WUx9nYqC6NZvEh2pNShGsGWyFLpdVhXi/VqEcnOw3r13NzXiIuzsp30dhbJzoOvapFO0fEhMYtl58uq67GyOwkLT/tFbyU7S57uJie50SN43K77LCQq+fX58eH5yVqMSB9L1gY6flh+ZBA7FW9cGz1dMbcs6OaUgbIzqoE4DP4mI+1c2z3a2xlugx9PdppRDyUzF0xxbFPXxuRk5/ugk2zfY0dgoCHjKxvFFQkrwyfY5+1sHariXCCVsql99R29SnS/MlRf68R1WrJ9B4y/pvtXqbdTv9HUvUxlZ75U5bxbijeFGn/eENOSnY6n7eISJaZiEbt9OLbs1OyPjQx/m54bTtvFevu81jeKp7qMu1WY1EV4jO5VdH5gFfk/v38syDaLAQdCDvdpdB0m6eKLDTVdA90Pm82u2mceHLcozcrWphEbTY3TcXXZTTsjqqtYer0+r7dvbT9U5lfr51zv88feBMHAUYBumexsz3f1IcfeeL3EmCsNsj2sVweXkyJvZ64vmv2hjEVPt71akTElr/csyI4hPORdP3lZNRvI5ZEn4UJJFNjvukocn1kiP7rnq7TOrzkyDO+KvpkSeb5Iduq1FVN2FvbY0pF2xu1uCEId+DOa7Izyf8nMBRXHNnVtTFF2DoDUX06WtYcBVVoXuYjSksNlhRc0LTu98jIuK3gNSvc7f8NjXVVVe75Q/BYX5cgMihY6Q9NFi7RiHGobq3hkp8ZHR5ML4my960mdNxPLzsIwVzUrh3NVUnYe1m1Qk/i58m61YvLxwfQOZW2a1MGqF3hlVbjmD3cISub8A6MSgjX49FxuLjZfz6fRXpba9VrQx16fH1uHoc6VcDMG2z6bzqZVa/N+GiOmS7Va4Or8PuxYHS87fehp23CP2+e1T+eWslOk5lpz+Gbsi8ru/36NDD4jIrq/3w5k79NtP6ciTt7Uq7fz7x3Wzt/1sl1Uq0NzR18hYVZjizlYZ7lEfmTjvZXMu3FtpJvV/zC32Ge8uCjuzxfJzmuPtLNud1sQyriJz5OdqmKN9amqumDmgoJjm7o2Zi07W5nVCqdYcfnXpnQu0Z4XfdZH6aKMnYYtgltZwbi98ladZNuIWPmbWDjrQqvb+sjbXgjZKD+wqq2kDDcFsjNgKynFYXE93s7TdlE1kmObeVuGtWfGmhuCc+qcDZ2YTRMIomGz6Jux7Ls3TqreI4VCOyBtDJW/RU0eL5Qo07C17WZej8oyQHY2WUp5vAN3pbRQEx0prlKRN8PokUHdXbJB/Gqv7AydqBfJzqAhQlNSHYzZnRlbNabtBzfUlZVd7vPUC0xBHyvst8NY+nRLm76pVb8KJp/Zqz8LfZWssm08Nd0IqfRJ3C4D+kzzvCzWq6iH6HCDz6uN/lpKCsXw2TETuSTI9hYj7Xzb/XZ7O4N8ZWVn8LB3Pw8CUi6ZuaDg2KaujVnLTqBxkbfzjjEh2bnfaF/cZdsd/dQVn1IQr1ZWlV5nbaRgZJIa+9bMuSFcQg4nnvDifm+nFfCplIbWEquFtwZWh9Su0U7SG/a3ypVxIp9tDJUfJ5PMfJSB1omkm0a/Dy15UmuqgV4PL8pJ1e2NDE+fSvfDvFvPLJTIauwZ+65tXN3K65XszKIPj+LtNHeEGp02Zvp9SAPLLrpr+6RbFmRxvx3E8qfbO8kru7m9GrnFs5Cu5KAFw0ZpfbnOPm5sYr0re5jXS7/R1EWxPjXpB03wabXRW0t6EokWQD/q7bS65Q1G2hm3e7S3M1XtMXNvbhuycz4cmrpg2tM2eCc5svODHNvUtYHsBJPFhGSnmi2sA3562flAvv9w80e4gOoCApU5G054zg8ZHBMa3SuKrOs+kRPPa3cCp06h2NtZLDvVrwRUPrWEjmKrhJwwN+qYxlC5a1rcPWtkvD4/WgsH8X2Tq9r25C1rJkjW6gNGoS6QneruhuES94TVIWV82Hs7pWWmvA05hLIz02T54LReOylzwcCyp3a4SUuxvN8OYPnT7UrUq3xu9ixY9e8OyxF2eftiiXh7ofdjx0XrullZnwlaIT3QfWJtZHqpse8uHiuKI1D6ngsVMnDtkXbO7X65t/NCyRedMydrKdozrJUnsvODHNvUtYHsBJPFpGSnzde3l5IThuxl4I8eKZSc5sO5oZ082ik2npu1lG0/+YC388mvTLdFM+wen7fu1onTDoT1b8Ynd7XhTe3eNO16TsSViTQLzl4yw4aT72eLbZ10H3A2ZdK2s2WnN60ih0ke6328/v3jZdW89S4rO30OVf1nt34l+lUvhBQcfnZUek9yaIH1l9358INO4jW2GSyd6LflLH+65Utx87V0u2ch4qs/0fSk1uZ8mnarRZ1ZOO37IMKhU3Uutrx++7zaSDwObZ7t20nP9nBvZ6K3iASvPtLS7smb5i5Oj1SJttaljpg6HPFFvUb7gzPXzDm2qWsD2QkmixnIzoYX79iBEGZ4kQdjEF+sN6TDL8zb9xl4j5x6uzNSfUGOberaQHaCyWI2shNCCCGEEMKWY5u6NpCdYLJAdkIIIYQQwrlxbFPXBrITTBbITgghhBBCODeOberaQHaCyQLZCSGEEEII58axTV0byE4wWSA7IYQQQgjh3Di2qWsD2QkmC2QnhBBCCCGcG8c2dW0gO8FkgeyEEEIIIYRz49imrg1kJ5gskJ0QQgghhHBuHNvUtYHsBJMFshNCCCGEEM6NY5u6NpCdYLJAdkIIIYQQwrlxbFPXBrITTBbITgghhBBCODeOberaQHaCyQLZCSGEEEII58axTV0byE4wWSA7IYQQQgjh3Di2qWsD2QkmC2QnhBBCCCGcG8c2dW0gO8FkgeyEEEIIIYRz49imrg1kJ5gskJ0QQgghhHBuHNvUtYHsBJMFshNCCCGEEM6NY5u6NpCdYLJAdkIIIYQQwrlxbFPXBrITTBbITgghhBBCODeOberaQHaCyQLZCSGEEEII58axTV0byE4wWSA7IYQQQgjh3Di2qWsD2QkmC2QnhBBCCCGcG8c2dW0gO8FkgeyEEEIIIYRz49imrg1kJ5gsJik7354eqsft2/n7j/N+U1Wbl57rD+uqqlYH46v9puqF9cOXlctAL1+fH1M5fH1+7Lu5uMvb00O13gflWjy9qjRP20V/iR6eT93Fbenenh7apE7bRb5KB5TdyLNNkZPCdHyG7Y5hVa9I4bAurPn9xmXssO6qRbbp6/OjkfPegpv5L+lLRfXZU9XFPWTI3T+pRDL/F1RFf/HNfvj6/GjWSZfm8Oeor5MUPe83658/zt9/vKzSnWF4X7r+aDNw9D5tF5my3FHNR1NG2xAtzKfs7emhStXky8q6oz0xfcpTvN+kH96mqu3xufnJyL3ODwVNnRtofnvaLnKJZDKw3yQ7qpzUHp5PpgmRm0lnyLFNXRuzl53n3bKqj+7P5e7sPnSfNjjW6oNjXbWXhom8vx9r97f/S11x3i1V2kYagxFkKEzYYbk7y392aG48Ss5viAnKTm09aKWRGKYft4enh5LhuMQae9NJCZsjwZdV2pbN/lbNW/HF3u5J1JL81riXtDCCUhzWVbJWoynZsskG1KdPNnllT+bDO7bZU1IhyInPs69kcZeujKfXw9ODM2K6NQ5/5WFdVevt26lrkQJLKJv/qOf0o3fZ5eIeUpABn8L1S2RfLIXEa+Hyhyq17L1BZ84sfySf4kufo56no+x5v0X/9NXe3S62brVZPM5ok7HO41wVrPG1bXEPNd/V/35TPTw/rap4jNJ1Uj1u3877jS1KzUWTD8jOD41LRYrLmFXjCWKsOU4PBYd19/d+U/WsFJdVQsaq6X7YVFSUTk7rzpRjm7o25i47vdRUWqv9p5JyWnl6rRWorvP5uFu6X3a/8Rcd66qqd2d/zwxSStIuSOLy7taNNI1EYlcFI+X8dpic7Ixn1tfnx4TsaZZFu3H/ZWWs3OupS88TsVljL+uq+axoLdbbKFUVSR13o82Tm0LCNFcHY6l1qCEobZGsMydTqMfVRlXIMP+tZmYm1kbbev+jxDzKtWy5t1P/tk3TZTW0hDJ2cPhVlP/AMH14PsXWz37T3c4tvvSvepTVT1J25owYZY5fv0RD/OoDSl0oO3sfZK9SCp+jgqejufvA5/0W/TPSbPLbqJjjjDblslOPtFa7tF/dQ837/IjUml4aPxHBHBcpn/DZTCjG7sm9+biUfai7+ryS7LxFrwtq6fXtKV6mCTKQffDX+zK/fZP5Ptl5izHzi3NsU9fGzGWnVJ3y7+TV9TGjt/zPI1HqPgikbc5LmfnqvU/1yfz0yU59n9vn/PMwLdmZCuaJQ22bcTyeBqzPhRzVZkQc6RTYXqqrecOlZ9wPrIrWdj+sq8V6JXTm6nASstOnud80X4Uz7lBDsGSqs2pb2kBhtYd3CZd748qRn7i/g7VemUj399vTw2K9WmSdRfLWvQGNKd+pNMiyBkFvlaZDs1rLw7LyWzOuafTXN+WJ6jOk8rye7LxViW4kO3t6vJSdyWgC0Z2GPUdvTw9dJQcd2/fA4uf9Fv3T6h4fl523GG06wRab9Z16d0Pr0z6v+a3Re6Sab2tPLKe2lRDUamqOa/PT/Fatr6334pkKBMznjEulwaVXkp236HX6MhP9o1bclGJ9xI6Ijru6kJ1iWLtwFXK6HNvUtTFF2fnrz6dvDU4//5q/tES8VZkI0lCLRUI2kaL0sGaQl51eHVo59E7MOMi2PqqPu4Q+JeefhwnJTnsdV33rFkq7VWqlJbxJESXlphlnCEYr0MYEE86saqZMhyGJLMml8dVG5LnNRlJ2PixCB+8FhqAqXcZzmDaqNNb7YbKzqXNbpcv6V97srk3fnh6qx4eFaEdnYLVr7ZaNUlVVVT1uvxWX6O207fpVQprKrA7waXRRW6LLxeZd59tvvm2sqIfnk1iYKNuuZvDaQbbXL1FJLN/Q7Z3DvJ0lsrP0ORI9oa1nn8jLqqpWz6eU7Ew+7zfon4ZnZvG0/7DsLK2lIaONzLPIT5eZKMi2yNt5TzXfYLNeVY/bN9FX31x8b6q6Ni/Bbk9XRYbsVLztuJR9puQRDLm9naP2Opex1eGcqEzXhdSV5/1GTXN2PHDqtuLKPm8njDi2qWtjcrLTa85C5elwrAt8i6G8M2TneVdXPj7VSlM6Az/kM0yLQxX12+PtHCPnn4PJyM5QSBgTWLhSGO45LHCeDNiLGDPQVFY6OkvK7Sl3FvkpPOXtDG/hJ6EiRFOghYSd9LKqEsdaDJKdbVUknMPSqykyrI5zEMv5cnfNJTIsG7LrvQEFxmUGSdkpDLiuGv3FwgITHV6uxw/osQN7yBB/4/VLNH6Q7SDZWfwcuQK6RF7Ds2dKn/cb9k+9g930do4+2gyWnRkkvZ2fXvNG73pZVY/bw2l/6YliXXs9PD9ZSznWpHmTcSn9RLtlxPiUpuCpGb3X6Y7Rc2tfe7qTBBOly956pfcQxWcvGbIzAkcKKY5t6tqYmuwMVee3b99++qXgdykFF2zubINOU3BXt7qrTLxlkBFvLht1XavrjnVVRXs3Q9kZQZ6HdOucfx4mIzs10/s5jQG6ZbdC3H3Sv8GvgRKEKcSBuzasuUeFS/kQ01Nub6e6Mj70IpRz6WXR03ax3j6vtTWQ2kSUq59Enduy09lkqZhkv0fIGUz64iDILTxlJJFbY6YvaU3ff0x81NuZMu+a/pk6X+eji9wlPeTasnNYicYPss0i9r1kn6MBfrwLnvcr98/9RoUSFATZjjDaDJKdXZfLGuWj17z5UNiRsQVw5wzppFYb0TqBZr7tuJR+og/rxmvaKztH73XflexMezvVlWH2cl5K0Z3MzaKRt3MtCsKRQhHHNnVtTE12/vJTqDqL/J3n3bLe7WqtlUKnXezatD7SqSae46E+Q6nxEmfJJr+1vJ21SNuSmNfL+ZiYpuwUE0b6GFU33boJo5ks82K172zJhOlg2jf9y9LtFNI4cl1BRGRX3tvpMhwZB2EVyXvF2Tis2+CrYJG1u7gV548PZtyUrrGCpejAjZacJo3Y2oTUDBpdhGgGfq3SiCxdmSIA+3o+DX/3Xq/CrVjQQ3ywd741b1SiPv/G8Dc9RA9m3ts55BDa3ufISKGqKvOCQc/7DfrnYV1tnraLavXcyq0+2TnOaDNQdmZjtvs0w2fUvCt79EzJ6rVmlsxZ4n7Z7mW7qFaHlyBeN5g4bjwuFR9RViQ7x+l135XsNJHoQj9O24VYwpYSNDGs6W7j9veKbtNtA/Zd6JJRcdIc29S1MTXZeZm3sw2wVXG2wStT3g2N2YnBpa1Xb+YzDFVh6O1UX5h7O33WlEa8ec4/FVOUncHKsT3ZtOvT3UF/zRFB657V7mvKziT08udTtw2mFZzuhIDskUJGnagPo4IkpmQxl4uQP3PqSltOw72d1vtLol8pqyI8PyNr6rVRiz4w2zjEuNTbGYb7Ghju0xAdpse8010rG6k1jCU9JB8IHR4Hde0SiQ5p1OplBlbYbdKyc1i8/YDnqHWqdFu4jRc5DHner98/m7KI83ikXRu2ZnFfGlhLJaNNZldkKDvbNcf1KtIVOo5x3Jo/93o7rW4p1ZS93Kn2JshN+OFDdOtxKRu4HsjObNOP2Ou+K9k5wNtpt4gqTgK6br214Pd2hqsJ0HNsU9fG1GTnJXs7jZdUmq8jkbKz0XLyNZ/KfejfPWLj5ns79dm03TtRxN7O5l+JY2zxdt4UFw8ihrlpTGZ7sUdCuT2Nw2aCof+m3k5ru5HpwWtPai2UnUEGjBMdzCnZEqv9O6nKa6zAdk/ITquJqzLZqawEN5dnopXMkhqRUX0+jXb5XJhrVVVpEWXZjtcy7/QJFn0s6iHukwLZeYMSyZ3Pw2Rn5hkPvShJ2VkSxm92GN/rkv0zrrSme9uRcvnn/fr9s30PYflJtqONNqXeTi3s21F38xQOKaPXfNQhpahYbR7NB1y8vMSooqC9ZLvE+wZvMi4lctLzHPV7O0ec47qyB7LzyUWFyFUM6+5VZb/kxhy1dN3KTqWOFDqsq+RW1XlzbFPXxuRk5/ugk2zfYx9moCHjKxs3XxTMqiRbfDasTke9G9Nd1voPlbTNyrfU6UD6vvJ26kihYx0U9PNy/jmYmOyUQ3O4IBp4xtTQn/62bOj/cf5+rb2dobcz463q29upbicNFyNyL76XjDJyRfNhPOYyfwIflJ3W0VD2ptzOd12Qmg9idNZA/l0vuqRyg194iFF0sTvaIXWsZWCmaIPJGVhB9UrzLge/xO4s7H6xVNhDZCB06vb+gmuXSJt0JgrPtcp1tpTs7N0EOPw50mdfWU+HDs0QSD/vt+ifRl3FTSBco6ONNhkXYqK5z9bIHDfBiDXf5+2M69l4KIzo0/boI3mXxdNWneh+i6c4YnZGSPkGI47Y615WVfWwWT/0jw9NiM1T6UhS5O3045KSnc0BYBuUp8WxTV0bU5SdAyAjaZ2HzwemSknnYkp71ZSQXFnx5l98YlwW7MfM3CoBFTfrZaaXnc3t61pc+4k5/xxMSXYG43IUECgCrtJhn92H5kT++d5Oa3oWk1/nDDHW4JXNIQ54SEX1qHu1+qS1cuJyhW7DW3k7TVEhmsYMKsuZBd0FYfu6G63/ofQsxGr1e+2iDFb049y6Jg6RPkeqEmbE0D1UF3k7h/QQK2xMl9TZcFcvkXB3DPV2Jo1Xw+5/WQkz1Hek5MvuIw5/jlR+kqNE2fP+dv3+KS/r83aOPNqUHKsTVZ15vGpXUaPXfNLbaTyAbsqzu6U+Pq07mC2a+9rFjn+40bg05Nu9eB1LAk0o6Xi9ztd5/vVO670aP7NX5keD+EQDMdR3k5p+KAi1FRzb1LUxa9nZKqNWUcYiyb82pXOJ9rzosz5KR59WZUIkBrey5GOJZCvxdjZ/ixfAdEfgdj9svZ6nT8z552BKshNCCHs47I0y8OvyIm8nHJ3NOQu8bRJ+Csc2dW3MWnaCaQPZCSGEEEII58axTV0byE4wWSA7IYQQQgjh3Di2qWsD2QkmC2QnhBBCCCGcG8c2dW0gO8FkgeyEEEIIIYRz49imrg1kJ5gskJ0QQgghhHBuHNvUtYHsBJMFshNCCCGEEM6NY5u6NpCdYLJAdkIIIYQQwrlxbFPXBrITTBbITgghhBBCODeOberaQHaCyQLZCSGEEEII58axTV0byE4wWSA7IYQQQgjh3Di2qWsD2QkmC2QnhBBCCCGcG8c2dW0gO8FkgeyEEEIIIYRz49imrg1kJ5gskJ0QQgghhHBuHNvUtYHsBJMFshNCCCGEEM6NY5u6NpCdYLJAdkIIIYQQwrlxbFPXBrITTBbITgghhBBCODeOberaQHaCyQLZCSGEEEII58axTV0byE4wWSA7IYQQQgjh3Di2qWsD2QkmC2QnhBBCCCGcG8c2dW0gO8FkgeyEEEIIIYRz49imrg1kJ5gskJ0QQgghhHBuHNvUtYHsBJMFshNCCCGEEM6NY5u6NpCdYLJAdkIIIYQQwrlxbFPXBrITTBbTkp2vz48Pzyf14WFdVet9cOXb00OVxeLpVaaweelPU+Shqh63b/k7ip/L1A5rd+uXVSJrroCn7SJfhmp1SF8mCvj6/Lg6pKr0tF08bt+aQiWK/Pb0kK6N4nwWNKVOs/3V29NDW5bTdlHplnpZqcRfVqpdRCI/zvuN+1s09+vzo/zbyGdP2Qf027BSVEFcVnv7bYtclvabsA/4T+xGOW0XPQmmW8qlHzxBl7PtkD0f9ldUW6Jbtbvvln30j/zZfFhST0eulePsqbuYlRY8HaJmfJqP27dmvDLQ9AH1q7enh/B5LOuZ2bJnaDaWbM387Qbeun0uRJG/7rhkN02q6qyqCJ/KfPVGlXzaLnqGkRvWxnhP602el7a8qiPBJMc2dW0gO8FkMXnZaQ6+2Xno9flRTC2R/NusI0EokzptF48P8QzaGW3dLbp/BiK2/WdoBUYFzFuNqtRiYg5nsj5J4GTn28myXIPEcymU5FMzMM50ZXY5CRYFDmut+XUivt2D+55eD08PwnRu0vRFO6yrar19O/lKS6PXeLK7nChF90+n6DK1FBu1sirypp7vA8GHtiVt0+6ocSavZgAd1kEpCozjlAF3s3YvNWTF8NIVQXRp1xDJRSg9NBmGeKqJXelE2+mnI+jGfnHBZ883vVh6UE+cXJIIlidUZare/pE+097dWMfpIFZbUulnvlK1t3h6lf3/K49L5jJf3JGiiu2ybcjO7B2jGaoH6/00n9brPy+uQnpUK2w5tqlrA9kJJouJys7klNPMLqWy82VVVQ/PJzG+O4MsNVE1tkjsDtWyUxl2tu/UtmauKTvf/BT+vWjib7DeF13cZaY8n71+0Tbn0kLKOkVdMTcvKQ021Vr8AAAgAElEQVRWSfsjMv5S83fGoup1/SW73OZF+ZYLZWef4z3st2FJz6mHpbOf5H39lekqTeaz0J9QWF3Svu+3rrIW2C3aPRofgkrWzaoeiqDV4gu+/zjvN13GXMu25m/4EJlOcvXUb176RZrzw+w31cPiMSs7ddnd36YSDnTsNWSnUfMZb6cSfuJXJbKzza3o2F97XPI1kFBNuef3Q7Kz7X6JlaOw+Sb1tEZ3v8bz0vbeOEoLmhzb1LWB7ASTxWRkpzKtXDCYGHZDw6hAdgZLj+1QLuzdeFZzS7CRp65Adjrjr7nsZVU9bg/aXty8BJNcHjnZWWSsi4LHVZSb0uS8W57PrKEpmqwkfCtXung+Dib+RIqyM2TwibIz7RAW3UxEXnVBkqF9Znk79cKHy483aCwlmbbXzeDYgUzb6A6pWyRk5y3a3UgnCMV0pmpcnM2L6+fO9NcRfc0S2Opwen3z2qCxvM3VqObioPP0KCJjQc1FWTdf9Xg7Vee04J/i2IwO8AEPee8mhY/KzphfdVxS/VAF2kQDUVk969kzXtTodn90U+o+v47ZVMsEn9b7eV5mzLFNXRvITjBZTEZ2yhki+md6xdROJL/tTcMOnQqDV0PZKQSDkgHdlH97b2fH7LLoNWTnAG9niexUN8qswTtDIUzTMO9O242b4BN+7Ez4U+qyQf32AtnZdk67BgYEevXt7VTqIpSdwhpbHXoCFy+omRzLd2QlZefN2r3T5K7fGoZs1+5NfbYWsK2c9xtvzTf1XCknTLeMFcrOh8VjFXn/Hp5PnRgwNiAE9eCbOFjO65Wd5hZ3a/HoKt7OxPNe5O3UayiXyU5V9i84LrluacjO/vLKPSOR7LSaNTVDGblysnN6T2uiDn0HuOXzAhuOberamL3sPO+WVX10fy53Z/eh+7TBsVYfHOuqvTRM5P39WLu//V/qivNuqdI20ijJtcZydxYFSN48V0b9faroqQwY+Rkbk5SduQNFHrdvg/Z2auZjBYPDgcJ9U8ocTEQJKtm52gRrwI+rzUDZma4KH+CUia1S/lVdRd2+mrh6P0t2poIDgy0x5Xu9MuHTgUGTwQdkZ1s5JbKzbbhUUHfBlsvI1DMdkuHWI0N2Ckdoxl4vNmGLmQl0L4KWTNdtd2nICgO0qwrbEST6gFGTWuFHDd1I69jbeQ5Ud7BloNMAJmSexTKZXXwjXiNrRt8iyNY56ovaXclOHRrzEQv+K45L3WLEw/OTVXtNq9lzxHVkZwZx1NIkntZ/uIPnBSI771J2SpklhFr7TyWetPzyUi7Qi+fzcbd0v+x+4y861lVV787+nhnktZvPu1fBzWc6SwPKaMlOUxBnRfJ5t0R25nDRCBLtEklEIRYH2ZahmS304S5652Qo/4KTcm3ZaR8teJ0gW1c5hhIIZnTLFyplp5j5LFftwCDbLIIKOW0X6+3zWk/VfQdyJkqk+4aN23s729bpl51dn1Hr9EHPL5OdaZG2en568BFxwgkwiuwsPMU36fvtCym/bruXG7LSf2I2R+dSFmeQKIRrB7oRgxBrlZPEcWtRHarHvP9IoW4QMJEyowMX0EdkZ6Kxoi3Ncj1F1uTHZOe9j0tyXvOxOb4vuRVPc/NhW8D44Gi/8T4QRSWys+vYpdU+kad1/OcFIjvvUXZKlWUprujq+phRiv7nkSh1HwSyL3Sbvpd9Zfsal8vo0/o4sIzdBclSNl8jOz+CoWOHmwDsbRjBIH6xt7NjbJyZE6Hai5KQAYbsfFlt1iu5aaSqqnBbSGBJ9wTZhr9S+dFvyAiKljBDi2VneT6z2/+sd0K0IWE6Oq7vDM+uSh9tu3BEb6crY4/slI70KDhQlivjQwg2+5luz67qZH7ux9sZFDbLjOy8SbuLyMBBhuxTZ0peqnxMb+c5kZNC2SlHofV+gOx83L5pB37Oe1P6OoreXhFKKQVTdoZC60Oy88uNS4e183O+bBfdpu4otF5cHz7I+lyli2Rn1kEdr6ZN5Gkd/3mByM5Pk52//nz61uD086/5S/PORod07GuoIiORl0hReh8zyGs3r0u1QjU8miVlVLld7s5hQuomyM6P4KIRJH2WoFY7hbKz0MHShZtaQjT2NoQMZWdVVet9O/+Fc78vVDjv5mSnNrDiaEw9XeVSDqNA+4Nsy/OZbZSIwZG8Tq1lD7lpcqsOk1DrAp0gt3E7b6fMnrXkEZz6qF+3Y/S6XFdXAd7yvkY7hrewZafDp+7t7F5fUfrmg763zl6z3Y33N5aF7cUvZ6pkMEXqCBwh6dOy03gi2jSzBno0apXJztfnJ7nAZ57MKQr+Yh66dlNvp8pJc5yvymGBhzzf077UuKRmFtlk4QjTdTB7Z68pO4MMh7KzGUMW65X12h413E3taR3/eYHIzs+RnV5zFipPh2OdUUpOuoVKy5Cd511d+chaK02p3y7zdtp7O+0Nn8VldAkHm1Zt7yay8yO4aATRc2eD1mcYKqsh3k5bUoaTcTzJibDbQtkppj13uoOarX0BwyXnjOwMAmuDWbzf3eGX6qNJMX0on3DHleWzyMksshQ1qB1g6ZVSZUQUK/0cn5eo0+kWtttZX0Ziq+DqkvWFiO6He3/+RFRLscgsejFJG03dpJyIOW9XEx6eX5TPWedZBeNpb6fdLsl2D6olkbEElfbOVLi6u13zN2l3ObxkDdl99xKOLmwvWZPXkp3Gbur9Rq9TWPXg920+98vOznNoPF+uLWLTP44WtrtE9jnaN4f3bp62fd5Of1/zlRXDVsESFf4lxiXdJ2U9hKrvR+fLda62NtBUDxGDvJ36EAS3TeapSd/Y0D6pp/VTnpcMh4+9E+TYpq6NqcnOUHV++/btp18KfpdyTAabO9tw2RTc1a1iLJOdGWS1Wyx5e74oKWOb5d5CIjs/gotGkEgFiUCUIHA016csQyGwdeINkNak7u3jQWrEXxwa666A5sYYW87p6crb34ZJYVSO2HYiHAJ9AZNdZsrzOWBjj4xYk6eYNH/LRJxM6pUlYtUga9CoBjXeM9GVJdEZUpUW6P+wO2VN8JKAcN+g1jnG4TnJPsjWftXKBS9QSeYzrahN2mb6y8p8ZlUNmBLiFu2uV6ASbztwi0pa7/UZsjl42ak+jprD2ncdyC3rJFtVIgtCdlYiCDDc8me2hTUWJft8dvA5dXKl19upfIxxsoUdMijFFxyXugy3R/XIMX/RqPd4o744ziAqmhJp2aJZnTOA7BXTe1o/43npb4LhXX1SHNvUtTE12fnLT6HqLPJ3nnfLerertVQK3Y2GnEtKP5dq4sEc6u2U6tSfSauS9PlIZKqojG2qKjErNWTnRzB07HC29UodDxhEG4q3n1+0t1OG2VwzYlDTsN2FclgdUvuvvInjJ+xwRumOu4zy31mTyUNZ3N3Tlp+frfUJDUX5LNz410VXJlrB5UFsQus52nS9Dxa/g5XpuC/9ONuGRXbyzkmyhDkY1lKyNsw0zVwFhp30Gfr2zaVs3zq1M83XVdIkKlxxT/iFomck2EjsYP7wBu0ugwxluQz/iX/xb5um7MyDdov1ejtVfGC8Uy6ok952jyrTawy/OyB+g1SiLVIe9USfz9aMWlYztvl5Uz7KRrQWOcyI/7LjkuyT3X/jZS+zOVS76/zkt1bKGs6OcmJg+Ta9p/UznpeeTitKPVOOberamJrsvMzb2QafqhjUWG9Fcq4Tg0tby93S23msl8su9fNuWdW1kZQqT08ZXVaWu3M2W8HJvAaQnT0YfTCC8Jq8bKvYFBifpwLhpZzvc/S1eJG3E8JP59imro2pyc5L9nYab7g0hZOUnY1XUL4C01/fSbLreTtDNJ5LLTuz3s7SMqaPvdXZQXZ+BKMPRhBCCCGEcKoc29S1MTnZ+T7oJNv3WKQFGjK+svEERppLic3u5SlZb2frbHSXtS5GJW0T6u1Y18dzuewsL6NP1Gvm9qUxUQrIzksx+mAEIYQQQginyrFNXRtTlJ0DIOWU01n+SB3rNSS9ckporqzsPO+W6QNvO1VX/vLOpOwsL6OVF3GX4OihdBhuUT19ApCdEEIIIYRwbhzb1LUxa9nZarpWUcZCyb82pVNyPS/BbN5+KZyQQVyqrcksDdcv28q8neVldLnQp/VGBbBfqBLmDNmZw+iDEYQQQgghnCrHNnVtzFp2gmkD2QkhhBBCCOfGsU1dG8hOMFkgOyGEEEII4dw4tqlrA9kJJgtkJ4QQQgghnBvHNnVtIDvBZIHshBBCCCGEc+PYpq4NZCeYLJCdEEIIIYRwbhzb1LWB7ASTBbITQgghhBDOjWObujaQnWCyQHZCCCGEEMK5cWxT1wayE0wWyE4IIYQQQjg3jm3q2kB2gskC2QkhhBBCCOfGsU1dG8hOMFkgOyGEEEII4dw4tqlrA9kJJgtkJ4QQQgghnBvHNnVtIDvBZIHshBBCCCGEc+PYpq4NZCeYLJCdEEIIIYRwbhzb1LWB7ASTBbITQgghhBDOjWObujaQnWCyQHZCCCGEEMK5cWxT1wayE0wWyE4IIYQQQjg3jm3q2kB2gskC2QkhhBBCCOfGsU1dG8hOMFkgOyGEEEII4dw4tqlrA9kJJgtkJ4QQQgghnBvHNnVtIDvBZIHshBBCCCGEc+PYpq4NZCeYLJCdEEIIIYRwbhzb1LWB7ASTBbITQgghhBDOjWObujaQnWCyQHZCCCGEEMK5cWxT1wayE0wWdys7AQAAAAAAmBWQnWCyQHYCAAAAAABwD0B2gskC2QkAAAAAAMA9ANkJJgtkJwAAAAAAAPcAZCeYLJCdAAAAAAAA3ANmLzvPu2VVH92fy93Zfeg+bXCs1QfHumovDRN5fz/W7m//l7rivFuqtI00hmY9eV87vyGOdX38zJx/EpCdAAAAAAAA3APmLju91IzU2rGulFbTytNrrUB1nc/H3dL9svuNv+hYV1W9O/t7ZpCTij7N827Zl4CXnakb1sdPzPknAdkJAAAAAADAPWDmslOqTvl38ur6mNFb/ueRKHUfhI7IjBuyx0NZ6O0MclvXPal+Ss4/CchOAAAAAAAA7gFTlJ2//nz61uD086/5S/MuO+EJTP8++DIQsn0C9UKfof5ZvTNvpFWw93YmUv2cnH8mkJ0AAAAAAADcAyYnO73mLFSeDsc6I5WcxgoFqCE7z7u68vGpVppS+X3AZyg2oBo3ikRkNsi2Pn5mzj8LyE4AAAAAAADuAVOTnaHq/Pbt20+/FPwu5d4LNne2Qad9Pr5Wd5WJtwt9hl0+knlyv/bfNiHCy92u1rtU/X0+I+efBmQnAAAAAAAA94Cpyc5ffgpVZ5G/87xb1rtdrbVS6LSLXZvWRzrVPlVW6DOUGq8732e5XFb18bxbLus64+1sr1zuzsfa7e3UJ9XGObhezscEshMAAAAAAIB7wNRk52XezjbAVsXZBq9MeTc0ZicGl7ZevZ3P8LxbLndHdfpP4tfNiUDqJNv2gKDuxFrjxTB4OwEAAAAAAADXwtRk5yV7O42XVIozeMzrWqEnX/Ppr+8Og72dz/BYizNmBWK52LySs0sreB1KcK7tJ+T8M4HsBAAAAAAA4B4wOdn5Pugk2/fYhxloyPjKxs0XxdYqyZY86adNR70b013W+g+VtO3b3ekzlBWJwoupJLZO/xY51wcfGX/eEMhOAAAAAAAA7gFTlJ0DICNpnYevPVInkJZO2/W68bTkSos3r7zsc2ib73KOw9Db2aS4s27qb9mpT3EWUZvITXKO7AQAAAAAAGDumLXsbJVRqyhNsdZ68TqXaM+LPuujdFFqVSYCV4NbWSGtBVGqrcKLd5j69JS3c+dP4o39u5+a808CshMAAAAAAIB7wKxlJ5g2kJ0AAAAAAADcA5CdYLJAdgIAAAAAAHAPQHaCyQLZ+ZURnqjV/Tv/slwAAAAAAHCHQHaCyeJLyM5j/QnbYfsORXY5CTb0BgdWDc2mdeaVdQSVnW7wjain+JW67+fdMtyvHKY6plo13nWUOizMuLQfRo1k85I6dCxxuUq6714XFQAAAAAAkweyE0wWX0B2lh7pG7z5xv9CGflabPUcfxWe/nQ+72rxYfSunWpZH/vTbs64Cl8SG2c185n4Sr4lNnhBj/7V+VgHYkqro/aU57NMzhCCStnGV6i8hRkyLo5rwnjNkpF0//Fl0ZlgxUsCCdVYKjv7RWXxW3vTLwfuLTEAAAAAvh6QnWCyuHvZ2Wd4C9nUaMLm9TdSYql3rVbVst512rDH/re/7lSJTrjPMScTM2RnXFB/hfFFILjqug6vsmopFFQ+T4bUioSnFJ2tb3WZUnPHuloul/2ys6uC5n+ivtLqTcvOTJpBUYq6kUyzp/PJJQddTgu+nowlAbuRE2VHXwIAAAATBbITTBZ3Ljs7uWC6yQzb3Os/9erUqj6mwjh7kFOlBbGSw2SnFj/mLk0lcN0/nGpR2ichB4+7cyRaU2VWddxo9iCktw49qKLYu12R7Ixryl8fyrzgw7quS2RnPkhb11XGLWosQoT1WO8SP29+a1a765pB9DayEwAAAJgfkJ1gsrhn2emjRkPF06iPPuM7IzfFLQq9nUPCHaUStL/fFcrOOH+W7DzvloECGxRT2hPF2yarY3jfOzFnORy957JHdqZqqT4ew+KYUawlQbZRxo0yylYW7l9dhcnOYri/jQDmeM1Bd9Fbyc7w4QEAAADA3QLZCSaL+5WdRjxoVS13x2YPpXXeS8ocz8vOAgmZ+GW96/d2ColxgbdzV1d1XevtpWFAp0h+cCF666cTLbu4ep0ui3VnW7oC2envUtf10mf1rFs5EHypIFujMtPqP3IZR1c7Pdgja7uaD4SxnWOdZ1ewgbJzuRygJJGdAAAAwJcBshNMFvcrOxXMiMv4sk575n2TKvzysr2d3o1a12ldl3Jy6SuyQbZpafUey86MtzMTrtwTKxxF8IoUs5qpTHY6VeQ9pM3awnKZ3OXZLztlHl2iKcelXVflDsVj3WRVrzDEodFGYZQ6HiI7m+pCTQIAAAATA7ITTBb3KjsD3ZgSf6nv00pKK4Jh3s7w7NZWSelEwqNh8xK3/0ih9x516e7aIzvV3fqKHZ13a9Wxj0KNAn9FifKy04g37XazqtDV2OO72/3/7Z09jus62m7nwlF8k5GhidgwNJQLCHCgCdwOOmoIcKKkcfoAjQ5cgM8+OP6SDmoHGzfwDfTHn5eU5CqbMrUWFrqrbImiZe0Cn/NSVN4VYSc/Rjh22rNpm2JJmLtVRdUMp1WP4WK+9PyXiMcm2RI9AQAAEoPYCcmy1tj5GEZS8fNItVNewUjsgbhKjIXWQbmkZ/ZsjEb9RxyS48xqp3SM4Kv6B+qitTzJ1jy4vQ7srEm28nvaRxXCf7/gkpXWfAsM+aO1J8h323ivpD5hWgFT75Nn0q9Q//7CvZ0zL0wAAAB4A4idkCxrj51TdTnPKq9zq53Oe4sXa1k04A+l3GDsNFa2lZddnXNvp3hahFsTjU5pM2alJYXMX+zZq9PVzkB3m8JeG3acNDuE3Jmx03vejY/h1g/FNocGm8Jes8qtpve3ueqVT/tcfW1JoeXLDAEAAMAqIXZCsrxD7PSvQ+Pe8ieuDePJqnY17XZrnPH7kETDLcoHmLfPnGrnXX59wb2d4hnTMpA0YdNcjMZemsacnHqrcvtxKgvu7fTUn7sTaO9l1A7tSc72eZXPhr7PEKt9kdUfO51tPI9IEf4jwnBkT4MLYicAAAAkArETkiWh2KmP1WdUO8fN7aSjzWathCRqHC9fVO/8QrVT+JBfjJ1CpjMmbMr1Te89kW5zs2Jnt5t4i+NU7Ow2F05V4PElHpwybRcYF8bOGa3rR/ieamcY+z8XAAAAwGohdkKyJBQ79U0nY6c+ehePYd6j6IzaxwS2ZFQ/FTtNPLnRk6eWxM7QWjRdO+NNqk4fu/3spXic8yjETu8H7N+1U2ubKoUqbPcd2hN75a5M3MI77GBkYG+3xc4Hk6DbnWHGtHflZWInAADA9iB2QrK8Q+wMYd5GZ2Qcp07n7qNtHcwVwqbOyqjWi9Nr5Fofw1vttHrnmVYcPuA4jdb7yaJhVP60e0T9ddf2qx6+8MlJtrOmOwdWO3qo2ulZ31iaquw84oVJtgAAANuE2AnJ8g6xc+69nc/EEzd9Wz2/W/Y0zamHTY5vz7nj9FWn1V9TleqXefX7eILH9Z+mq51rwRsniZ0AAABwJ3ZCwqw9dgIAAAAAbANiJyQLsRMAAAAAYA0QOyFZiJ0AAAAAAGuA2AnJQuwEAAAAAFgDxE5IFmInAAAAAMAaIHZCshA7AQAAAADWALETkoXYCQAAAACwBoidkCzETgAAAACANUDshGQhdgIAAAAArAFiJyQLsRMAAAAAYA1sPnbeqlwVTf9jXt36F/tXW5rCeKEpVLep3cj93hT9z+NPxha3KjfaFtpY2nXvceX+2jRF0byy5y+C2AkAAAAAsAa2HjvHqOmktaZQRlYzk+eYtazUdbs1Vd7vOewzbtQUShXVbTxmgFBUHNu8VflUA2Ps9B2waF7Y8xdB7AQAAAAAWAMbj5166tR/9m5dNIG8Ne7uhNL+BbsQGShDTlQoZ1Y7rd4WxUSrL+n5iyB2AgAAAACsgRRj538vv//W8vvlv+FNwyU7rRLo39960wqyUwH1wZqhuVtRiQcyU/BY7fS0+pqevxJiJwAAAADAGkgudo6Zc2by7GmKQFTqM5YdQIXYeasKNc5PldrUk98XaobaDajCgZwQGZxkWzSv7PmrIHYCAAAAAKyB1GKnnTp/++23//w5Yz9fec+6ubObdDpV4+ty17zw9mDNcOiHt0/93uO77RThvKoK8y7V8Tiv6PnLIHYCAAAAAKyB1GLnn/+xU+eseuetyouqKsysZBft3NKm9JLZ6lQqm1kz1DPesL5PnueqaG5VnhdFoNrZbZlXt6bo7+00V6p1e/B9PY8JsRMAAAAAYA2kFjsfq3Z2E2yNebbWI1PuQsYcwmAu59Xn1QxvVZ5XjbH6j2fvdkUgYyXbboGgYcVa4cEwVDsBAAAAAOC7SC12PnJvp/CQSm0NHnG7Lujpj/kctx8Wg31ezbAptDVmNdy42D6Sc2jLehyKta7tC3r+SoidAAAAAABrILnYeV+0ku3drWFaGdLdsi3zOXNrjcjmXemna8d4Nma/WVc/NKLt1N2dY4eCIVGrYhoR22z/GT03Fz4SfnwixE4AAAAAgDWQYuxcgD6Ttq/wdUvqWNGyz3aTZTwzcvnD25i85HVo2/dChUO72tm2WEkHHQ85pE9tLaKukaf0nNgJAAAAALB1Nh07u2TUJUoxrHVVvKEkOvGgz6LRS5RmKtMmrlqHkqa0zpil2iU89w7TsT2j2lmNK/G69d2X9vxFEDsBAAAAANbApmMnpA2xEwAAAABgDRA7IVmInQAAAAAAa4DYCcnyfrFzmLT84H2vS+5ADmwzuxlxrzXNswYAAACAVUDshGR5u9ip3Sr7WO6clxfHwxhrD4+HdJuZ8Uwc945iAAAAAIAWYicky9vFTr1i+FDunFum1FbGateSclag0n+XAuXE2louZFEAAACADUPshGRZbeyUFgCey/Bs2EfQsp+xALI1P9aInfLcWWInAAAAAMyH2AnJQuwMZ7/hsUB3q6KpxU738TzDvmN3Qjx2nygAAAAAJAWxE5KF2GkTzH7j/ZtmVBSXH6LaCQAAAADzIXZCsqw2dmr4qonmm3NCmx1FQ3VIcwWh2SlW24XYCQAAAADzIXZCsrxD7AzlziWpU0qOnuDpLmT7hdjJJFsAAAAAmIbYCcnyFrHTv3jtgtTpy42eHY2FbAO7z4idsyF2AgAAAGwYYicky3vETk+8XPAMz7GgWA0/Nd3uvrRnlDyHX+QjDR0kdgIAAADAQxA7IVneJHZKCVN7aSKviQ9CMR6K4mtgXMj2C7GTSbYAAAAAMA2xE5LlXWKnM+t1dui0C6Vmxps9S5dJtgAAAADwVIidkCzvEzt9MS6U1fSs2OdBu7QobaMd8BuWFCJ2AgAAAMA0xE5IlneKnVKQCyQ1fWNtM3dGq5kox9xoTJx9YJKtSN/O5MxbAAAAANgWxE5IlveKnU7w9KZOI3MWxbxKpZk8h6CZV7dHYmdTCLv65gbfqpwoCgAAALBpiJ2QLG8UO71zVuW0ppUVpyfIFo27AJBZFl06yVYLrY2ZWPUFcpvKyKUETwAAAIDtQuyEZHmL2OlGvjy3X5ECW1PMjYzt3uO6tXenvLkwdurVT6dQeqtyvWNGMCZ4AgAAAG*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" alt="" />
/// <summary>
/// 接收微信发送的XML消息并且解析
/// </summary>
private void ReceiveXml()
{
try
{
Stream requestStream = System.Web.HttpContext.Current.Request.InputStream;
byte[] requestByte = new byte[requestStream.Length];
requestStream.Read(requestByte, 0, (int)requestStream.Length);
string requestStr = Encoding.UTF8.GetString(requestByte); if (!string.IsNullOrEmpty(requestStr))
{ //封装请求类
XmlDocument requestDocXml = new XmlDocument();
requestDocXml.LoadXml(requestStr);
XmlElement rootElement = requestDocXml.DocumentElement;
WxXmlModel WxXmlModel = new WxXmlModel();
if (rootElement != null)
{
WxXmlModel.ToUserName = rootElement.SelectSingleNode("ToUserName") == null ? "" : rootElement.SelectSingleNode("ToUserName").InnerText;
WxXmlModel.FromUserName = rootElement.SelectSingleNode("FromUserName") == null ? "" : rootElement.SelectSingleNode("FromUserName").InnerText;
WxXmlModel.CreateTime = rootElement.SelectSingleNode("CreateTime") == null ? "" : rootElement.SelectSingleNode("CreateTime").InnerText;
WxXmlModel.MsgType = rootElement.SelectSingleNode("MsgType") == null ? "" : rootElement.SelectSingleNode("MsgType").InnerText;
switch (WxXmlModel.MsgType)
{
case "text"://文本
WxXmlModel.Content = rootElement.SelectSingleNode("Content") == null ? "" : rootElement.SelectSingleNode("Content").InnerText;
break;
case "image"://图片
WxXmlModel.PicUrl = rootElement.SelectSingleNode("PicUrl") == null ? "" : rootElement.SelectSingleNode("PicUrl").InnerText;
break;
case "event"://事件
WxXmlModel.Event = rootElement.SelectSingleNode("Event") == null ? "" : rootElement.SelectSingleNode("Event").InnerText;
if (WxXmlModel.Event != "TEMPLATESENDJOBFINISH")//关注类型
{
WxXmlModel.EventKey = rootElement.SelectSingleNode("EventKey") == null ? "" : rootElement.SelectSingleNode("EventKey").InnerText;
}
break;
default:
break;
}
}
ResponseXML(WxXmlModel);//回复消息
} }
catch (Exception ee)
{
//记录错误日志
}
} /// <summary>
/// 回复消息
/// </summary>
/// <param name="WxXmlModel"></param>
private void ResponseXML(WxXmlModel WxXmlModel)
{
string XML = "";
switch (WxXmlModel.MsgType)
{
case "text"://文本回复
var info = oauth.GetUserInfo(Tools.WA_GetAccess_Token.IsExistAccess_Token(), WxXmlModel.FromUserName);
Tools.WAEntity.OAuthUser user = Tools.JsonHelper.ParseFromJson<Tools.WAEntity.OAuthUser>(info);
var content = WxXmlModel.Content.ToUpper();
string NcbActUrl = ConfigurationManager.AppSettings["NcbActUrl"];
string appid = ConfigurationManager.AppSettings["AppID"];
if (content.Contains("T"))//接受的文字如果包含T
{
//业务处理
}
else
{
XML = ResponseMessage.ReText(WxXmlModel.FromUserName, WxXmlModel.ToUserName, "/:rose农场大数据欢迎你!/:rose");
}
break;
case "event":
switch (WxXmlModel.Event.ToLower())
{
case "subscribe":
if (string.IsNullOrEmpty(WxXmlModel.EventKey))
{
XML = ResponseMessage.ReText(WxXmlModel.FromUserName, WxXmlModel.ToUserName, "关注成功!/:rose");
}
else
{
XML = ResponseMessage.SubScanQrcode(WxXmlModel.FromUserName, WxXmlModel.ToUserName, WxXmlModel.EventKey);//扫描带参数二维码先关注后推送事件
}
break;
case "scan":
XML = ResponseMessage.ScanQrcode(WxXmlModel.FromUserName, WxXmlModel.ToUserName, WxXmlModel.EventKey);//扫描带参数二维码已关注 直接推送事件
break;
case "click"://处理单击事件
if (WxXmlModel.EventKey == "p1")
{
//自己的业务逻辑
}
else
{
//自己的业务逻辑
}
break;
case "unsubscribe"://取消关注
break;
}
break;
default://默认回复
break;
}
Response.Write(XML);//输出组织的XML信息
}
这就是菜单的信息处理,不明真相的群众貌似会问那个所谓的ResponseMessage到底有几个意思呢,OK,我已经无力吐槽我这三天研究出来的微信公共平台的东西了。
public class ResponseMessage
{
#region 接收的类型
/// <summary>
/// 接收文本
/// </summary>
/// <param name="FromUserName"></param>
/// <param name="ToUserName"></param>
/// <param name="Content"></param>
/// <returns></returns>
public static string GetTextTest(string FromUserName, string ToUserName, string Content, string key)
{
CommonMethod.WriteTxt(Content);//接收的文本消息
string XML = "";
switch (Content)
{
case "关键字":
XML = ReText(FromUserName, ToUserName, "关键词回复测试——兴农丰华:" + key);
break;
case "单图文":
XML = ReArticle(FromUserName, ToUserName, "测试标题", "测试详情——兴农丰华:" + key, "http://www.xnfhtech.com/templets/boze/images/20120130083143544.gif", "http://www.xnfhtech.com/");
break;
default:
XML = ReText(FromUserName, ToUserName, "无对应关键字——兴农丰华:" + key);
break;
}
return XML;
} /// <summary>
/// 未关注扫描带参数二维码
/// </summary>
/// <param name="FromUserName"></param>
/// <param name="ToUserName"></param>
/// <param name="EventKey"></param>
/// <returns></returns>
public static string SubScanQrcode(string FromUserName, string ToUserName, string EventKey)
{
return "";
} /// <summary>
/// 已关注扫描带参数二维码
/// </summary>
/// <param name="FromUserName"></param>
/// <param name="ToUserName"></param>
/// <param name="EventKey"></param>
/// <returns></returns>
public static string ScanQrcode(string FromUserName, string ToUserName, string EventKey)
{
return "";
}
#endregion #region 回复方式
/// <summary>
/// 回复文本
/// </summary>
/// <param name="FromUserName">发送给谁(openid)</param>
/// <param name="ToUserName">来自谁(公众账号ID)</param>
/// <param name="Content">回复类型文本</param>
/// <returns>拼凑的XML</returns>
public static string ReText(string FromUserName, string ToUserName, string Content)
{
string XML = "<xml><ToUserName><![CDATA[" + FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + ToUserName + "]]></FromUserName>";//发送给谁(openid),来自谁(公众账号ID)
XML += "<CreateTime>" + CommonMethod.ConvertDateTimeInt(DateTime.Now) + "</CreateTime>";//回复时间戳
XML += "<MsgType><![CDATA[text]]></MsgType>";//回复类型文本
XML += "<Content><![CDATA[" + Content + "]]></Content><FuncFlag>0</FuncFlag></xml>";//回复内容 FuncFlag设置为1的时候,自动星标刚才接收到的消息,适合活动统计使用
return XML;
} /// <summary>
/// 回复单图文
/// </summary>
/// <param name="FromUserName">发送给谁(openid)</param>
/// <param name="ToUserName">来自谁(公众账号ID)</param>
/// <param name="Title">标题</param>
/// <param name="Description">详情</param>
/// <param name="PicUrl">图片地址</param>
/// <param name="Url">地址</param>
/// <returns>拼凑的XML</returns>
public static string ReArticle(string FromUserName, string ToUserName, string Title, string Description, string PicUrl, string Url)
{
string XML = "<xml><ToUserName><![CDATA[" + FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + ToUserName + "]]></FromUserName>";//发送给谁(openid),来自谁(公众账号ID)
XML += "<CreateTime>" + CommonMethod.ConvertDateTimeInt(DateTime.Now) + "</CreateTime>";//回复时间戳
XML += "<MsgType><![CDATA[news]]></MsgType><Content><![CDATA[]]></Content><ArticleCount>1</ArticleCount><Articles>";
XML += "<item><Title><![CDATA[" + Title + "]]></Title><Description><![CDATA[" + Description + "]]></Description><PicUrl><![CDATA[" + PicUrl + "]]></PicUrl><Url><![CDATA[" + Url + "]]></Url></item>";
XML += "</Articles><FuncFlag>0</FuncFlag></xml>";
return XML;
} /// <summary>
/// 多图文回复
/// </summary>
/// <param name="FromUserName">发送给谁(openid)</param>
/// <param name="ToUserName">来自谁(公众账号ID)</param>
/// <param name="ArticleCount">图文数量</param>
/// <param name="dtArticle"></param>
/// <returns></returns>
public static string ReArticle(string FromUserName, string ToUserName, int ArticleCount, System.Data.DataTable dtArticle)
{
string XML = "<xml><ToUserName><![CDATA[" + FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + ToUserName + "]]></FromUserName>";//发送给谁(openid),来自谁(公众账号ID)
XML += "<CreateTime>" + CommonMethod.ConvertDateTimeInt(DateTime.Now) + "</CreateTime>";//回复时间戳
XML += "<MsgType><![CDATA[news]]></MsgType><Content><![CDATA[]]></Content><ArticleCount>" + ArticleCount + "</ArticleCount><Articles>";
foreach (System.Data.DataRow Item in dtArticle.Rows)
{
XML += "<item><Title><![CDATA[" + Item["Title"] + "]]></Title><Description><![CDATA[" + Item["Description"] + "]]></Description><PicUrl><![CDATA[" + Item["PicUrl"] + "]]></PicUrl><Url><![CDATA[" + Item["Url"] + "]]></Url></item>";
}
XML += "</Articles><FuncFlag>0</FuncFlag></xml>";
return XML;
}
#endregion
}
OK,加上自己的逻辑代码,是不是完美的实现了回复?
第七坑,我真心不想计数了,你确定这个回复可以么?说真的,宝宝不确定,因为你写了之后知道在哪里调用么,我的乖乖,尼玛,服务器验证通过就把回复加上去是最保险的。我已经没有节操了。
接下来我们说什么呢,我们就说说获取用户信息这个东西吧,因为我们这些东西一般都是基于H5页面的。所以,就要用到之前我们配置的
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABG4AAAChCAIAAAAZXm5PAAAexUlEQVR4nO3dv24az9fHcS7LEjXXYiE3XIQbeldQuCKitoRSBSSKn5TKX8UVkiVLRIpECEKCguIpeIr9NzM7s7sQE4Zz3i9tEcOywI7jmQ9ndmgdL+bt7e1yB8cZaJEI0SgAAEAbMeOf1uUOLeYciUGLRIhGAQAA2ogZ/xClFKFFIkSjAAAAbcSMf4hSitAiEaJRAACANmLGP0QpRWiRCNEoAABAGzHjH6KUIrRIhGgUAACgjZjxD1FKEVokQjQKAADQRsz4hyilCC0SIRoFAABoI2b8Q5RShBaJEI0CAAC0ETP+IUopcukWeR+2W61Wb9pk32mv1R6+Vxwm0R6+mz/mmj3JLbj4f5PXTWe8XXjvWm67g1Un2cbbhfljvk12xXEGq/6r+fjDaGzf4hxhsh2NSwc0jwkAIrwP22aX5vZw057Va3k6wIo+EZBJTEwgSilyyRbxBp40DAUf4L/vfdhOOp2ka8l/NO4X1ONc/r/JYTRedecHzz3LbXewmR2zuJX/mFnM1+kDfSmrO167t+Q7p+GtyFqzSXbv64YoBUCcac/q74qey9PZZblp2vP3m+GeE5BDTEwgSilyoRaZ9rx/96c9q3oU7jLczqMuSsn68O7zG+V14ykEOVsSdeqiVJZ/dv2slDSbmPWrzSy/xXwBdpSiKgVAhaSzCn6uaHSU016r3e5Z/Zisjg1oQExMIEopcoEWKT6HM+cv+MJVfv/7sO2doJcXmzwT/HpT62Y50/suFKWSrLLcdt0pecf09iJKORP8NrPjcTHPy01psjJuqdiyGEZVCgCOR+8kivdhu9frpV1Z6DNGUhUUEBMTiFKKXLpF8k4hFHUqPq0zHlJXlZLlMo0SKAeZgedYX5XKFTP9QszHEqUAqJL3bW5fVY5S78N2ezjstdrD92nPuK++KvXz58//Bfz8+fMz3w7wT4iJCUQpRS7WIlk30h6+Zz+U+oRsn17PnlDuzAM8eqNUVfK6cZ/fKFmtqT/ZdAbr0TK7vbxuhCdK+SfjLebr7nzbD9SjuvNDdqidtQ/LTgBQI++6gh8a9qbpBI00NzWZC2jxpilyFG6UmJhAlFLk81skrUMZ87+b9QiVk/V8Vame8YEdy06cwChPlQOMryrVnxRrVNjFqF3fDGaZ2aS0pgVVKQD6+GZQBLqrvATlu7+6PuWkKXIUbpeYmECUUuRyLZJlKKcbyStO7mdvblXKusN7rVTR4Qi7OPeTG8WtLLlVqVIpqXStVBGEnOy0q6pKOa+htPy6J3EBgCBnRqnGJancx8dHkqN+/fr1qe8A+KfExASilCKXaBFrOp/Ra3i/Y6piNoO9hmy+koVxrdQ0nVwuKkhd4VopIx3lmce+ViqJPaXw469KeXiXtQhdrwUAIqR9VeVqte4ngqdXpRIfHx/kKNw6MTGBKKXIP2iRIiz5rmYKrSBh9yZ5P+IuOxFYdf22XS5KedbuOx5GY7tO5YtSaQHKrSwFq1Lu7ME8QRk3UpUCIFsepXyfDNr+rioFyCAmJhClFLlsi1hrT1TvUtlzTHutIjoVUSpZQ70nLk1dsSo1m2Rpx4pSh9F41ZlsSmkqWJVazNfm8uvu4hbZcxGlAAiWr600tW775GulADHExASilCIX+l6p5h+jNalKJf82Lr4qd0+iqlPXq0ol/85qTZOdJwi9boxLoRpXpYzXENqfWAVAGF8EOiVKFd2plO4NqCQmJhClFKFFIkSjAAAAbcSMf4hSitAiEaJRAACANmLGP0QpRWiRCNEoAABAGzHjH6KUIrRIhGgUAACgjZjxD1FKEVokQjQKAADQRsz4hyilCC0SIRoFAABoI2b8Q5RShBaJEI0CAAC0ETP+IUopQotEiEYBAADaiBn/EKUUoUUiRKMAAABtxIx/iFKK0*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" alt="" />
这个东东,其实这个相对于前面的至少坑少了很多,真心的,宝宝就暂时不说他坑了。上个代码吧。
//微信网页授权2.0
public class Oauth2
{
JavaScriptSerializer Jss = new JavaScriptSerializer();
public Oauth2() { } /// <summary>
/// 对页面是否要用授权
/// </summary>
/// <param name="Appid">微信应用id</param>
/// <param name="redirect_uri">回调页面</param>
/// <param name="scope">应用授权作用域snsapi_userinfo(不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)</param>
/// <returns>授权地址</returns>
public string GetCodeUrl(string Appid, string redirect_uri, string scope)
{
return string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state=STATE#wechat_redirect", Appid, redirect_uri, scope);
} /// <summary>
/// 对页面是否要用授权
/// </summary>
/// <param name="Appid">微信应用id</param>
/// <param name="redirect_uri">回调页面</param>
/// <param name="scope">应用授权作用域snsapi_userinfo(不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)</param>
/// <returns>授权地址</returns>
public string GetCodeUrl(string Appid, string redirect_uri, string scope,string state)
{
return string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state={3}#wechat_redirect", Appid, redirect_uri, scope, state);
} /// <summary>
/// 用code换取openid 此方法一般是不获取用户昵称时候使用
/// </summary>
/// <param name="Appid"></param>
/// <param name="Appsecret"></param>
/// <param name="Code">回调页面带的code参数</param>
/// <returns>微信用户唯一标识openid</returns>
public string CodeGetOpenid(string Appid, string Appsecret, string Code)
{
string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", Appid, Appsecret, Code);
string ReText = CommonMethod.WebRequestPostOrGet(url, "");//post/get方法获取信息
Dictionary<string, object> DicText = (Dictionary<string, object>)Jss.DeserializeObject(ReText);
if (!DicText.ContainsKey("openid"))
return "";
return DicText["openid"].ToString();
} /// <summary>
///用code换取获取用户信息(包括非关注用户的)
/// </summary>
/// <param name="Appid"></param>
/// <param name="Appsecret"></param>
/// <param name="Code">回调页面带的code参数</param>
/// <returns>获取用户信息(json格式)</returns>
public string GetUserInfo(string Appid, string Appsecret, string Code)
{
string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", Appid, Appsecret, Code);
string ReText = CommonMethod.WebRequestPostOrGet(url, "");//post/get方法获取信息
Dictionary<string, object> DicText = (Dictionary<string, object>)Jss.DeserializeObject(ReText);
if (!DicText.ContainsKey("openid"))
{
log.Error("获取openid失败,错误码:" + DicText["errcode"].ToString());
return "";
}
else
{
return CommonMethod.WebRequestPostOrGet("https://api.weixin.qq.com/sns/userinfo?access_token=" + DicText["access_token"] + "&openid=" + DicText["openid"] + "&lang=zh_CN", "");
}
} /// <summary>
/// 通过openId获取用户信息
/// </summary>
/// <param name="accesstoken"></param>
/// <param name="openid"></param>
/// <returns></returns>
public string GetUserInfo(string accesstoken, string openid)
{
string url = string.Format("https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang=zh_CN", accesstoken, openid);
return CommonMethod.WebRequestPostOrGet(url, "");//post/get方法获取信息
}
}
我们需要调用的时候直接用里面的方法,获取微信网页授权即可,比如对于A控制器下面的B视图要获取授权,并且要获取用户的相关信息,那么我们直接调用即可,如 GetCodeUrl(appid, "http://" + Url + "/A/B", "snsapi_userinfo")
在这里我还是吐槽一下吧。
第八坑,微信菜单JSON的url拼接,里面的前面不是加了js验证么,so,特么的,还是乖乖的加上http://。
不过这里授权之后,因为用户的很多信息我们都要用到,这就是H5页面传值的问题,我在项目里面用的是Session,直接写一个公用方法,如果Session有值,则直接取值的。对于里面的一些东东,我想说明一下,并不是所有的代码都要贴出来,我这边的代码只是我个人认为需要贴出来的。所以里面的方法可能有大家看不到的,如果需要,可以留言本宝宝,谢谢。
public string getSession()
{
log.Error("GetSession");
string oauthStr = "";
try
{
if (Session != null && (Session["oauthStr"] == null || string.IsNullOrEmpty(Session["oauthStr"].ToString())))
{
if (!string.IsNullOrEmpty(Request.QueryString["code"]))
{
Oauth2 oauth = new Oauth2();
string code = Convert.ToString(Request["code"]);
oauthStr = oauth.GetUserInfo(ConfigurationManager.AppSettings["AppID"],
ConfigurationManager.AppSettings["AppSecret"], code);
Session["oauthStr"] = oauthStr;
Tools.WAEntity.OAuthUser oAuthUser = new Tools.WAEntity.OAuthUser();
oAuthUser = Tools.JsonHelper.ParseFromJson<Tools.WAEntity.OAuthUser>(oauthStr);
}
return oauthStr;
}
else
{
Tools.WAEntity.OAuthUser oAuthUser = new Tools.WAEntity.OAuthUser();
oAuthUser = Tools.JsonHelper.ParseFromJson<Tools.WAEntity.OAuthUser>(Session["oauthStr"].ToString());
return Session["oauthStr"].ToString();
}
}
catch (Exception e) { log.Error(e.ToString()); return oauthStr; };
}
然后每次遇到需要获取信息的页面,我一般都是调用这个就可以了。
基本上剩下的都是我们自己要处理的业务逻辑了,继续说坑吧。
第九坑,微信上传图片,坑的绝对不只是自己。对于这个宝宝真的信了,不管你信不信。特么的图片不能for循环上传。当然,这个只限苹果机型,大Android还是没有问题的。
前面说到了JS安全验证的问题,这里就是调用这些个验证,请求一些应该的权限,然后获取图片信息等等。aaarticlea/png;base64,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" alt="" />
放心好了,宝宝现在都是上图说话,没图说个小弟弟呀。。。。。
我们继续回来看代码。
先来个处理Json的
public class JsApi
{
JavaScriptSerializer Jss = new JavaScriptSerializer(); public JsApi() { } const string URL_FORMAT_TICKET = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi"; #region 验证JsApi权限配置
/// <summary>
/// 获取JsApi权限配置的数组/四个参数
/// </summary>
/// <param name="Appid">应用id</param>
/// <param name="Appsecret">密钥</param>
/// <returns>json格式的四个参数</returns>
public string GetJsApiInfo(string Appid, string Appsecret)
{ string jsapi_ticket = "";
//ticket 缓存7200秒
if (System.Web.HttpContext.Current.Session["jsapi_ticket"] == null)
{
string ticketurl = string.Format(URL_FORMAT_TICKET, BasicApi.GetAccessToken(Appid, Appsecret));//"https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + GetAccessToken(Appid, Appsecret) + "&type=jsapi"
jsapi_ticket = CommonMethod.WebRequestPostOrGet(ticketurl, "");//BasicApi.GetTokenSession
System.Web.HttpContext.Current.Session["jsapi_ticket"] = jsapi_ticket;
System.Web.HttpContext.Current.Session.Timeout = 7200; BasicApi.WriteTxt("jsapi_ticket1:" + jsapi_ticket); }
else
{
jsapi_ticket = System.Web.HttpContext.Current.Session["jsapi_ticket"].ToString(); BasicApi.WriteTxt("jsapi_ticket2:" + jsapi_ticket);
} Dictionary<string, object> respDic = (Dictionary<string, object>)Jss.DeserializeObject(jsapi_ticket);
jsapi_ticket = respDic["ticket"].ToString();//获取ticket string timestamp = CommonMethod.ConvertDateTimeInt(DateTime.Now).ToString();//生成签名的时间戳
string nonceStr = CommonMethod.GetRandCode(16);//生成签名的随机串
string url = System.Web.HttpContext.Current.Request.Url.AbsoluteUri.ToString();//当前的地址
BasicApi.WriteTxt("url:" + url); string[] ArrayList = { "jsapi_ticket=" + jsapi_ticket, "timestamp=" + timestamp, "noncestr=" + nonceStr, "url=" + url };
Array.Sort(ArrayList);
string signature = string.Join("&", ArrayList);
signature = FormsAuthentication.HashPasswordForStoringInConfigFile(signature, "SHA1").ToLower(); string r = "{\"appId\":\"" + Appid + "\",\"timestamp\":" + timestamp + ",\"nonceStr\":\"" + nonceStr +
"\",\"signature\":\"" + signature +
"\",\"jsApiList\":[\"chooseImage\",\"previewImage\",\"uploadImage\",\"downloadImage\",\"scanQRCode\",\"onMenuShareQQ\"]}";
BasicApi.WriteTxt("r:" + r.Replace(" ", ""));
return r.Replace(" ", "");
}
}
然后看具体调用。
后台代码其实很简单的,直接输出配置文件,然后前台js直接调用即可。
JsApi jsApi = new JsApi();
string config = jsApi.GetJsApiInfo(appId, appSecret);
ViewBag.config = config;
前台代码,其实也不难,这个有官方的例子的。
<script type="text/javascript">
wx.config(@Html.Raw(ViewBag.config));//后台传递的微信配置文件
wx.ready(function () {
$("#avatar").click(function () {
wx.chooseImage({
count: 1, // 图片数量 默认9
sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有'original',
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function (res) {
var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
wx.uploadImage({
localId: '' + localIds,
isShowProgressTips: 1,
success: function (res) {
serverId = res.serverId;
getWxPhoto(serverId);
}
});
}
});
});
});
wx.error(function (res) {
alert("接口验证失败,详细信息:\n" + JSON.stringify(res));
}); var types = 1;
function getWxPhoto(mediaId) {
$.ajax({
async: false,
type: "post",
url: "/ActivityRegistration/DownloadWxPhoto",//自己的处理方法
data: { mediaId: mediaId, types: types },
success: function (data) {
$("#imageico").val(data.result);
$("#hed_pic").attr('src', ".." + data.result);
$("#hed_pic").attr('alt', "avatarImg");
}
});
}
</script>
OK,后台方法其实也很简单,就是一个二进制文件处理,不对,简单个蛋蛋,特么的,因为路径的问题,坑了宝宝一个小时,特么的。还有这里建议,等微信图片下载完成之后再给前台加载图片,保证每一个图片都加载完成,保证后台的图片的上传完成。
/// <summary>
/// 下载多媒体文件
/// </summary>
/// <param name="userName">公众号</param>
/// <param name="mediaId">媒体ID</param>
/// <param name="data">返回下载是否成功</param>
/// <param name="types">添加的图片类型</param>
/// <returns>返回多媒体文件数据;如果下载失败,返回null。</returns>
public JsonResult DownloadWxPhoto(string mediaId, int types)
{
ErrorMessage errorMessage;
string access_token = BasicApi.GetAccessToken(ConfigurationManager.AppSettings["AppID"], ConfigurationManager.AppSettings["AppSecret"]);
byte[] data = MediaHelper.Download(access_token, mediaId, out errorMessage);
string files = String.Empty, fileName = String.Empty;
files = Server.MapPath("~/Wxinphoto/");
if (!Directory.Exists(files))
{
Directory.CreateDirectory(files);
}
fileName = files + DateTime.Now.Ticks + ".jpg";
if (data != null)
{
bool flag = writeFile(data, fileName);
if (flag)
{
errorMessage = new ErrorMessage(ErrorMessage.SuccessCode, "下载多媒体文件成功。");
}
else
{
errorMessage = new ErrorMessage(ErrorMessage.ExceptionCode, "从微信服务器下载多媒体文件失败。");
}
}
else
errorMessage = new ErrorMessage(ErrorMessage.ExceptionCode, "从微信服务器下载多媒体文件失败。");
return Json(new { result = "/" + urlconvertor(fileName), errorMessage = errorMessage });
} //读filename到byte[] private byte[] ReadFile(string fileName)
{ FileStream pFileStream = null;
byte[] pReadByte = new byte[0];
try
{
pFileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader(pFileStream);
r.BaseStream.Seek(0, SeekOrigin.Begin); //将文件指针设置到文件开
pReadByte = r.ReadBytes((int)r.BaseStream.Length);
return pReadByte;
}
catch
{
return pReadByte;
}
finally
{
if (pFileStream != null)
pFileStream.Close();
}
} //写byte[]到fileName
private bool writeFile(byte[] pReadByte, string fileName)
{
FileStream pFileStream = null;
try
{
pFileStream = new FileStream(fileName, FileMode.OpenOrCreate);
pFileStream.Write(pReadByte, 0, pReadByte.Length);
}
catch
{
return false;
}
finally
{
if (pFileStream != null)
pFileStream.Close();
}
return true;
} /// <summary>
/// 判断目标字节数组是否位于源字节数组的开始
/// </summary>
/// <param name="source">源字节数组</param>
/// <param name="target">目标字节数组</param>
/// <returns>返回目标字节数组是否位于源字节数组的开始</returns>
private bool StartsWithBytes(byte[] source, byte[] target)
{
if (source == null && target == null)
return true;
if (source == null && target != null || source != null && target == null)
return false;
if (source.Length < target.Length)
return false;
bool startsWith = true;
for (int i = 0; i < target.Length; i++)
{
if (source[i] != target[i])
{
startsWith = false;
break;
}
}
return startsWith;
}
是不是以为这就算完事了,我的乖乖,头像上传了,微信摄像头也特么该调用的调用了,宝宝好幸福,宝宝也是牛人一个了,记住前面的东东,宝宝还没有说坑呢。
来重复我们的第九个坑,特么的,你JS写个for循环要是能循环把图片上传到后台,宝宝也服气,真的,宝宝服气。
直接说吧,最后我自己想了下,也和队友讨论了下,可能是因为微信有什么验证,导致之后一张图片上传成功之后,才能进行一张,但是我们Iphone就是特么的特例,大Android没用问题的,就是Iphone有了问题,而且问题不小,上传四张图片吧,老特么是最后一张,最后,找到了万能的网友,感谢你,不过宝宝已经忘记了在哪里找到的了,尴尬了。。。。。。。。。。。
<script type="text/javascript">
var types = 2;
var urlList="";
var i = 0;
function up(resurl) {
if (i < resurl.localIds.length) {
// 上传照片resu.localIds[i]
wx.uploadImage({
localId: '' + resurl.localIds[i],
isShowProgressTips: 1,
success: function (res) {
// alert("res.serverId:" + res.serverId);
mediaId = res.serverId;
$.ajax({
async: false,
type: "post",
url: "/ActivityRegistration/DownloadWxPhoto",
data: { mediaId: mediaId, types: types },
success: function (data) {
$("#picPath").append('<li><div class="imgbox"><img src="/img/cechanadd.png" id="picture' + i + '" alt="" /></div></li>');
$("#picture" + i).attr('src', data.result);
$("#picPath").append('<input value=' + data.result + ' type="hidden" id="picurl' + i + '" class="picclass" />');
i++;
if (i == resurl.localIds.length - 1) {
$("#picPath").append('<li><div class="imgbox"><img src="/img/cechanadd.png" id="picture" alt="" /></div></li>');
}
up(resurl);
}
});
}
});
} else {
i = 0;
}
} //上传图片
wx.config(@Html.Raw(ViewBag.config));
wx.ready(function () {
$("#picPath").click(function () {
wx.chooseImage({
count: 3, // 默认9
sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有'original',
sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
success: function (resu) {
var localIds = resu.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片 if (localIds.indexOf("wxlocalresource") != -1) {
localIds = localIds.replace("wxlocalresource", "wxLocalResource");
} @(index += 1)
if (localIds != '') {
$("#picPath").html("");
var sear = new RegExp(',');
if (sear.test(localIds)) {
up(resu);
}
else {
$("#picPath").append(' <li><div class="imgbox"><img src="/img/cechanadd.png" id="picture' + '@index' + '" alt="" " /></div></li>');
$("#picture" + "@index").attr('src', localIds);
// 上传照片
wx.uploadImage({
localId: '' + localIds,
isShowProgressTips: 1,
success: function (res) {
mediaId = res.serverId; $.ajax({
async: false,
type: "post",
url: "/ActivityRegistration/DownloadWxPhoto",
data: { mediaId: mediaId, types: types },
success: function (data) {
$("#picPath").append('<input value=' + data.result + ' type="hidden" id="picurl' + @index + '" class="picclass" />');
$("#picPath").append('<li><div class="imgbox"><img src="/img/cechanadd.png" id="picture" alt="" /></div></li>');
}
});
}
});
}
// $("#picPath").append('<li><div class="imgbox"><img src="/img/cechanadd.png" id="picture" alt="" /></div></li>');
}
}
});
});
});
wx.error(function (res) {
alert("接口验证失败,详细信息:\n" + JSON.stringify(res));
});
</script>
特么的,请记住,递归就特么可以了。
说到这里,宝宝已经不想多说什么了,特么的产品你能不能不装逼,你特么见过那个微信能回复一个信息直接跳转网页的,你咋不去屎呢,联想到前几天大阿里的月饼时间,突然感觉我们程序员挺悲剧的,成功的都是特么的产品,然后出问题的都是我们程序员的锅?试问一下,这个锅真心我们程序员该背么。
算了,还是不吐槽了,已经无力了。。。。宝宝92年降临,现在确实82年的皮肤呀,唉,宝宝累了,真的。
顺便给点H5页面的建议吧。比如当点击返回键的时候,我们需要刷新页面的时候,就是所谓的判断页面要不要刷新,这里有很多种方法,但是微信里面宝宝还是觉得这么干靠谱。
<script type="text/javascript">
if (window.name != "hasLoad") {
location.reload();
window.name = "hasLoad";
} else {
window.name = "";
}
</script>
还有,那个微信执行完成之后想直接退出当前界面进入微信公众号界面的,直接调用微信的一个内置的方法即可。记得写到<script></script>里面。
WeixinJSBridge.call('closeWindow'); //这是微信关闭当前网页
这么自信的以为自己搞定了所有,你跑呀,你要跑起来,嗯哼,别不服气。
微信公众账号指第十坑,我自己加的,哈哈,就是前面的JS验证的时候,你不要头文件,怎么搞定这些事情,哈哈。是不是宝宝赢了。Oh perfect,I like it。
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
这个东西一定不能忘记哈。
过去的都过去了,其他的不像说了,产品和研发真的是世仇么?求大家给解释解释。。。。。。。。。